fangpsh's blog

抓取微博,同步到Twitter

zelda

前几个月买了NintendoSwitch,沉迷于“塞尔达-荒野之息”不能自拔,同时也关注着NS 新游戏的资讯。 微博上有几个帐号会发布各种NS 游戏信息,不过微博做的和💩 一样,完全不想用。联系了那几个微博博主,询问是否考虑也同步发在Twitter,没理我,那就自己动手吧。

爬取微博

本来还以为得手动解析网页,偶尔发现移动版居然有现成的API 可以用,十分酸爽。

例如:

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

weibo1

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

weibo2

结构挺清晰的,data-cards 就是每一条微博,不过会有不同的card-type,选出card-type=9 的即可。

每一个card 里面,主要关注:

  • itemid: 微博的唯一ID
  • text: 文本内容
  • pics: 图片
  • page_info: 如果带视频,会有一个page_info,其中包含视频信息

这些接口应该有频率限制,不过我只想抓最新的,几十分钟访问一次即可。

发布到Twitter

创建一个帐号,然后再在这个帐号下创建一个 apps.twitter.com,直接生成一堆token,这样最方便。

关于Twitter 的认证可以参考:OAuth 认证步骤

重点得到这四个东西即可:

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

关于图片和视频上传可以参考:twitterdev/large-video-upload-python

微博的text 中带了大量的链接,需要处理一下,用re.sub 替换掉即可。
微博的话题是#话题#,而Twitter 是#话题,也需要处理一下。

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)

关于图片、视频的几个问题:

  • Twitter 的图片(除GIF 之外)限制一条tweet 只能发4张,微博可以有多张,需要注意拆分,然后把第一条tweet 的ID 作为第二条的 in_reply_to_status_id,就能串成所谓的“主题帖”;
  • Twitter 的视频有一大堆限制,允许的视频时长也很短。索性不传视频了,直接保留微博原来的秒拍跳转链接;
  • GIF 图片,Twitter 一条tweet 也只能传一张,还不能是动图,懒得判断,直接丢弃GIF 图了。
  • 传图片和视频时,记得带上media_category,图片是tweet_image,视频是tweet_video

写好之后,丢到VPS 上,15分钟运行一次即可。

@NinSwitch_News
ns_news

代码就不发了,写得很快很糙,也没啥难度。