前言

再次,工作需要。

还是信息同步的工作,需要向微博同步信息。之前是使用的selenium来对浏览器进行操作,本次也可以采取这种方法。但想尝试一下新的方向,正好微博也有供开发者使用的接口,所以就打算试试这个思路。

总的说来,本次工作主要是:前期配置 + 代码编写。

由于需要对工作内容保密,本次文章主要讲述入门知识,以及在这过程中遇到的许多坑。准备素材接口这一步,我的其他文章里有讲到,这里就不赘述啦。

流程思路

  1. 配置微博api
  2. 准备素材接口
  3. 自动发布代码编写

配置微博api

本部分会讲的较为详细,对于一个新手来说,这部分的知识很基础但很重要!

要特别注意这里面记录的一些坑,会为你节省不少时间。

微博api

微博为广大的开发者提供了下面这个平台。

https://open.weibo.com/

进入这个平台之后,首先使用你的账号进行登录,并进行相关注册。

注意

在注册过程中,会让你选择**开发者类型**。有“个人”和“企业”两个选项。可以按照实际情况进行选择。本次以选择“个人”为例。

选择“企业”会获得更多的开发功能和权限。

申请应用

申请应用的目的是为了得到 App Key、App Secret,设置安全域名、回调域名

申请“应用”,可以这样简单理解:为你的脚本提供一个后台。

步骤如下:

首页->微服务->立即创建微服务应用->粉丝服务平台->创建应用

创建过程中,应用名称可以写网站名称,实在没有可以自定义。

安全域名

在应用基本信息中,这一项很重要很重要!

  1. 安全域名需要备案的。
  2. 你需要有该域名下网站的管理权限。(因为需要向该网站根目录下传一个特定文件进行验证)
  3. 这个安全域名(或其子域名)必须出现在你的微博正文中。

注意!

在申请应用的时候,填写安全域名时,前面不要加 http 或者 https这种前缀。

在代码中填写安全域名时,前面要加上http 或者 https这种前缀。

回调域名

回调域名可以这样简单理解:给你一个授权页面。

在编写代码时,有输入用户名密码以及获得token两种账号方式。两种方式都需要填写这个回调域名。但如果使用获得token的方式,就需要用这个回调域名进行一些操作。如果是输入用户名密码,只需要填写域名就好。

这个回调域名不要求你有管理权限,目前看来是可以随意填写的。(这是不负责的说法)

设置步骤如下:

应用信息->高级信息->OAuth2.0 授权设置->授权回调页

代码编写

安装weibo库

首先给出这个库的文档地址:https://pypi.org/project/weibo/#description

python上有一个封装好的库可以用来调用微博的api,叫weibo

而安装这个库,大概率是要报这个错的。

1
2
3
4
5
"C:\Users\Skye\AppData\Local\Temp\pip-install-3ts0b_eo\weibo_c8fc1bfd2fdc49ecad10d472fc905fd5\setup.py", line 15, in <module>
long_description=open('README.rst').read(),
UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 241: illegal multibyte sequence
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

意思是在安装时setup.py这个文件由于编码问题解析不了。

而上面那个文件路径在电脑上是找不到的,所以不建议采用pycharm或者是pip命令直接安装。

解决办法如下:

  1. 进入pypi.org ,下载 weibo 库。下载地址如下:

https://pypi.org/project/weibo/#files

  1. 解压后,修改 setup.py 中的代码,替换成下面这样:
1
long_description=open('README.rst', encoding='utf-8').read(),
  1. 执行以下命令进行安装:
1
2
python setup.py build
python setup.py install

代码编写

以下我会以token认证以及用户名/密码认证这两种方式展开,完整的代码会在各自的部分最后。

token认证

首先在命令行中输入:

1
2
3
>>> from weibo import Client
>>> c = Client(API_KEY, API_SECRET, REDIRECT_URI) # 此处填自己的API_KEY, API_SECRET, 回调地址
>>> c.authorize_url

这时会弹出来一个网址,复制到浏览器打开:

1
'https://api.weibo.com/oauth2/authorize?redirect_uri=http%3A%2F%2F127.0.0.1%2Fcallback&client_id=123456'

打开后,会让你扫码认证,然后返给你一个code。继续在命令行:

1
>>> c.set_code('填写自己的code')

这样,client 初始化完成。继续在命令行:

1
2
>>> token = c.token
>>> print(token)

此时会返给你一串token,你需要将token保存下来放在代码中。

完整的简单代码如下:

1
2
3
4
5
6
7
from weibo import Client

token = {'access_token': 'xxxxxxxxxxx', 'remind_in': 'xxxxxxxxxxx', 'uid': 'xxxxxxxxxxx', 'isRealName': 'true', 'expires_at': xxxxxxxxxxx}

c = Client(API_KEY, API_SECRET, 回调域名, token)

c.post('statuses/share', status='你想输入的文本' + 安全域名)

用户名/密码认证

这个就比较简单了,如果你能记住微博的用户名和密码。

完整代码如下:

1
2
3
from weibo import Client
c = Client(API_KEY, API_SECRET, 回调域名, username='xxxxx', password='xxxxx')
c.post('statuses/share', status='你想输入的文本' + 安全域名)

传入图片

这个很简单,只需要新添一点代码:

1
2
3
f = open('1.png', 'rb')
c.post('statuses/share', status='你想输入的文本' + 安全域名, pic=f)
f.close()

不过要注意图片的路径。

常见错误

1. 21322 重定向地址不匹配

  • 检查安全域名是否填写

2. appkey not bind domain

  • 检查安全域名是否填写

3. text not find domain!

  • 检查代码中是否有加上安全域名

4. service unavailable

  • 原因:接口调用总次数用完了(每小时总次数150次)
  • 解决:
    • 插件的【社交评论】-【微博回推】功能关闭,一般等整点后或者第二天恢复。
    • 如果您的网站有采集文章,在【同步微博】-【同步设置】-其他同步设置 勾选”只允许在网站后台发布时同步,其他情况不同步”。

总结

本次实践中,算是熟悉了一下微博api的基本调用,实现的功能也比较基础。由于对微博api的不熟悉,导致我在前面配置上面画了不少时间,代码倒是很简单。在这过程中,我忘记了微博的用户名和密码,所以在这上面花费了许久时间,最后是采取token认证的方式。(在此吐槽一下微博的密码找回机制,太鸡肋了)。所以一定要好好看官方文档啊!