前幾個(gè)月買(mǎi)了 NintendoSwitch ,沉迷于“塞爾達-荒野之息”不能自拔,同時(shí)也關(guān)注著(zhù)NS 新游戲的資訊。 微博上有幾個(gè)帳號會(huì )發(fā)布各種NS 游戲信息,不過(guò)微博做的和:hankey: 一樣,完全不想用。聯(lián)系了那幾個(gè)微博博主,詢(xún)問(wèn)是否考慮也同步發(fā)在Twitter,沒(méi)理我,那就自己動(dòng)手吧。

爬取微博

本來(lái)還以為得手動(dòng)解析網(wǎng)頁(yè),偶爾發(fā)現移動(dòng)版居然有現成的API 可以用,十分酸爽。

例如:

http://m.weibo.cn/u/5084965647

http://m.weibo.cn/api/container/getIndex?containerid=1076035084965647&page=2

結構挺清晰的,data-cards 就是每一條微博,不過(guò)會(huì )有不同的card-type,選出card-type=9 的即可。

每一個(gè)card 里面,主要關(guān)注:

  • itemid: 微博的唯一ID
  • text: 文本內容
  • pics: 圖片
  • page_info: 如果帶視頻,會(huì )有一個(gè)page_info,其中包含視頻信息

這些接口應該有頻率限制,不過(guò)我只想抓較新的,幾十分鐘訪(fǎng)問(wèn)一次即可。

發(fā)布到Twitter

創(chuàng )建一個(gè)帳號,然后再在這個(gè)帳號下創(chuàng )建一個(gè) apps.twitter.com,直接生成一堆token,這樣最方便。

關(guān)于Twitter 的認證可以參考: OAuth 認證步驟

重點(diǎn)得到這四個(gè)東西即可:

CONSUMER_KEY = 'your-consumer-key'
CONSUMER_SECRET = 'your-consumer-secret'
ACCESS_TOKEN = 'your-access-token'
ACCESS_TOKEN_SECRET = 'your-access-secret'

關(guān)于圖片和視頻上傳可以參考: twitterdev/large-video-upload-python

微博的text 中帶了大量的鏈接,需要處理一下,用re.sub 替換掉即可。

微博的話(huà)題是 #話(huà)題# ,而Twitter 是 #話(huà)題 ,也需要處理一下。

t = card["mblog"]["text"]
t = re.sub(r'data-url=\"([^\" ]+)\"',
           r'> \1 <',
           t,
           0)

t = re.sub(r'<[^<]*>',
           r'',
           t,
           0)

t = re.sub(r'#([^#]+)#',
           r'#\1',
           t,
           0)

關(guān)于圖片、視頻的幾個(gè)問(wèn)題:

  • Twitter 的圖片(除GIF 之外)限制一條tweet 只能發(fā)4張,微博可以有多張,需要注意拆分,然后把先進(jìn)條tweet 的ID 作為第二條的 in_reply_to_status_id ,就能串成所謂的“主題帖”;
  • Twitter 的視頻有一大堆限制,允許的視頻時(shí)長(cháng)也很短。索性不傳視頻了,直接保留微博原來(lái)的秒拍跳轉鏈接;
  • GIF 圖片,Twitter 一條tweet 也只能傳一張,還不能是動(dòng)圖,懶得判斷,直接丟棄GIF 圖了。
  • 傳圖片和視頻時(shí),記得帶上 media_category ,圖片是 tweet_image ,視頻是 tweet_video 。

寫(xiě)好之后,丟到VPS 上,15分鐘運行一次即可。

@NinSwitch_News

代碼就不發(fā)了,寫(xiě)得很快很糙,也沒(méi)啥難度。