# 教你如何写一个推特转发抽奖机器人——API v2

By [RRRR](https://paragraph.com/@rrrr-2) · 2022-05-11

---

之前看到很多教程都是基于推特v1 api，现在来填补市场空白，写一个v2 api的经验分享

（总体来说v1更简单好用 可是。。。。普通开发者账户只能使用v2 只有v1时代的老用户和申请到Elevated账号的人才可以使用v1 ）

### 前提：

*   有一定的开发基础
    
*   有一个推特开发账号（[关于推特开发者账号申请的问题和经验](https://blog.csdn.net/qq_37206171/article/details/104260059)）
    
*   用到了 python,tweepy,flask（非必需）,TinyDB(非必需)
    

首先假设你已经有了一个开发者账号,点开你的App的 User authentication settings

选上 OAuth2.0 NativeApp(我也没发现有什么大区别 随时可以改)

下面的Callback URI 和 website URL 是必填项 如果有自己网站的可以填网站 如果你像我一样只是打算在自己电脑上跑 可以填 127.0.0.1就是本机地址 网站我乱填的 不影响

![callback URI必须是https](https://storage.googleapis.com/papyrus_images/20e75aa648f6af8e3e87eed78100fc99894513345fc06a18b5c176107848e3b0.png)

callback URI必须是https

保存之后 记下Client ID 和 Client Secret 以后要用到

![](https://storage.googleapis.com/papyrus_images/a3c43a3490da299594e23f2c7a439dbdb3c33d36712e19066d85d8208f94759d.png)

然后我们开始写自己的app， 首先 我们需要让用户（你的小号们）把账户授权给抽奖机器人

大概流程就是你的app产生一个链接 然后用户点击同意授权 这时候twitter就把用户的bearer token（用于操作用户账号 有效期只有2个小时 这就是为啥说v2比较麻烦。。。）和refresh token（如果授权了offline access 就可以用这个token来获取新的bearer token）给你 然后你就可以代替用户进行他所授权的行为了

我本地就是用flask 跑了一个简单的server，然后用一个叫TinyDB的本地DB（其实就是个json file）来记录账号的名字和对应的token 用tweepy来进行twitter的交互

第一步生成生成授权网址

![](https://storage.googleapis.com/papyrus_images/7bc857e09cd4fcca0f4d95d66d76726654dc12b9bae81fe7ac4e1b11220317f5.png)

![产生的URL大概长这个样 ](https://storage.googleapis.com/papyrus_images/2aa677616dadffcf9cba8d31a8479460965c8e3f87bf33d0ba761f798b4ec6d1.png)

产生的URL大概长这个样

![点击授权](https://storage.googleapis.com/papyrus_images/86f092229969cb9afa6e6af97f038d71f4136080a4780e647048d7a3a377b207.png)

点击授权

点击授权后 twitter会自动给你的callback URL发一个GET request， 你把里面的token解析出来再存起来就完成第一步了！

![](https://storage.googleapis.com/papyrus_images/1a271fa2c042fb6989e49c8c9a8996a977e95c719cec617653f260aea2a0f7ca.png)

![后端解析token 并存到数据库里 这里的name是我自己加的用来区分小号的 不是url解析的一部分](https://storage.googleapis.com/papyrus_images/708007aefbfc3c20a2daa828a317c8c7298b7ee29b0b75193239d1b21ff8f958.png)

后端解析token 并存到数据库里 这里的name是我自己加的用来区分小号的 不是url解析的一部分

现在我们开始进行关注，转发，抽奖！

我假设的使用情景是 我发现一个抽奖打算冲 就把这条抽奖推文的链接（简化为tweet id就是链接后面那串数字）发给机器人 然后他帮我和我的小兄弟们自动进行转发关注抽奖留言（全都是可选的）

（真实工作流程就是从数据库里把我选择的账户挨个进行操作 我这里就用一个举例子）

![](https://storage.googleapis.com/papyrus_images/765db3890e30ef0e2d7f4cbc755eae0875635411e097265343f5bcc70efca4ae.png)

其中从推文中找的需要关注什么人 是用正则表达式看一下推文里都@了谁

![](https://storage.googleapis.com/papyrus_images/5922fe0900fb9ef76585e0984f3a031eb542524f92d15f128bfdbd4e67149bf3.png)

然后还有一个关键问题就是这个bearToken的有效期只有2个小时 如果到期需要用refresh token再去request一个新的token，所以在进行操作的时候要用个try-catch， 如果登录出错 就在catch里面更新token 并更新数据库再重试

![](https://storage.googleapis.com/papyrus_images/fc7da7b6c1a30f814916ea56c26ac3606adf337b621cfcfe121d5f301058e5c7.png)

伪代码大概是这个样子

![](https://storage.googleapis.com/papyrus_images/8f4b0e08ef8298f28f0aefad06ec60cef2e9ced7f2471e65ced64f97d1fb79f5.png)

差不多就这样了 如果有问题欢迎提问！

哦 如果你是本地用flask的话 想使用https 可以看看这篇文章

[https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https](https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https)

---

*Originally published on [RRRR](https://paragraph.com/@rrrr-2/api-v2)*
