前几个月买了NintendoSwitch,沉迷于“塞尔达-荒野之息”不能自拔,同时也关注着NS 新游戏的资讯。 微博上有几个帐号会发布各种NS 游戏信息,不过微博做的和💩 一样,完全不想用。联系了那几个微博博主,询问是否考虑也同步发在Twitter,没理我,那就自己动手吧。
爬取微博
本来还以为得手动解析网页,偶尔发现移动版居然有现成的API 可以用,十分酸爽。
例如:
https://m.weibo.cn/u/5084965647
https://m.weibo.cn/api/container/getIndex?containerid=1076035084965647&page=2
结构挺清晰的,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分钟运行一次即可。
代码就不发了,写得很快很糙,也没啥难度。