使用新浪微博开放平台api同步微博内容至自己网站([官方PHP]创建应用.php代码)
优采云 发布时间: 2022-01-23 23:21使用新浪微博开放平台api同步微博内容至自己网站([官方PHP]创建应用.php代码)
参考文章
搜索的时候也发现是通过代码实现的:
[[API使用代码]WordPress自动同步到新浪微博头条文章]
【自动同步WordPress中的文章到新浪微博(纯代码,支持自定义A*敏*感*词*ey)】
[【新界面】WordPress新的文章带图同步微博]
分析
看文章,基本都是通过微博界面完成的,然后需要创建一个小应用,很麻烦。擦脸.gif。
OK,然后查看官方界面,发现只能使用一个。【第三方分享微博链接】。
好吧,那就创建一个应用,用微博接口来实现吧。Wordpress 是用 php 代码编写的,所以你可以查看 [Official PHP SDK]
创建应用
在【微博·开发平台】登录微博账号,点击【微服务】,【立即创建微服务应用】,选择【粉丝服务平台】(我是个人开发者,好像只能选这个) . 按照一步一步的设置。
确保以下要素:
另外,在【我的应用】-【具体应用】-【界面管理】-【现有权限】中,需要保证有第三方分享到微博。我在 2016 年创建的应用程序没有这个接口。
实现代码
在测试过程中,可以使用 POSTMAN 工具进行测试。同时发现不需要OAuth2.0授权方式,改用Basic方式。
在wordpress目录下找到当前主题的functions.php文件,例如:wordpress\wp-content\themes\twentyseventeen\functions.php,在最后(before?>)添加如下代码,
PHP下载functions.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/**
* WordPress文章同步到新浪微博,带图片
* 作者地址: http://laycher.com
*/
function post_to_sina_weibo($POST_ID, $debug = false) {
$api_url = 'https://api.weibo.com/2/statuses/share.json';
$app_key = '1234567890'; //修改为自己的app key
$user_pwd = 'dXNlcm5hbWVAMTYzLmNvbTpQYXNzd29yZA=='; //修改为base64位加密的 账号:密码,username@163.com:Password , 可到http://base64.xpcha.com/ 加密
if (wp_is_post_revision($POST_ID)) return; //修订版本不发布。
$post_status = get_post($POST_ID)->post_status;
$post_title = get_post($POST_ID)->post_title;
$post_content = get_post($POST_ID)->post_content;
if ($post_status == 'publish' && $_POST['original_post_status'] != 'publish') {
$status = '【' . strip_tags($post_title) . '】 ' . get_permalink($POST_ID) . mb_strimwidth(strip_tags(apply_filters('the_content', $post_content)) , 0, 150, '...');
$status = mb_strimwidth($status, 0, 128*2+mb_strlen(get_permalink($POST_ID),'utf-8'),'...','utf-8');//链接算十个字,共140个字,...算2个字
preg_match_all('//i', $post_content, $matches);
$first_img = $matches[1][0]; //将文章第一张图片的地址赋值给$first_img
if (empty($first_img)) { // 文章第一张图为空,
$request = new WP_Http;
$headers = array(
'Authorization' => 'Basic ' . $user_pwd,
'Content-Type' => 'application/x-www-form-urlencoded'
);
$body = array(
'source' => $app_key,
'status' => $status
);
$result = $request->post($api_url, array(
'body' => $body,
'headers' => $headers
));
if ($debug) {
logInfo($result['body']);
}
} else {
$array = explode('?', basename($first_img));
$filename = $array[0];
$filecontent = file_get_contents($first_img);
$boundary = uniqid('------------------');
$MPboundary = '--' . $boundary;
$endMPboundary = $MPboundary . '--';
$multipartbody = '';
$multipartbody.= $MPboundary . "\r\n";
$multipartbody.= 'content-disposition: form-data; name="source' . "\"\r\n\r\n";
$multipartbody.= urlencode($app_key) . "\r\n";
$multipartbody.= $MPboundary . "\r\n";
$multipartbody.= 'content-disposition: form-data; name="status' . "\"\r\n\r\n";
$multipartbody.= urlencode($status) . "\r\n";
$multipartbody.= $MPboundary . "\r\n";
$multipartbody.= 'Content-Disposition: form-data; name="pic"; filename="' . $filename . '"' . "\r\n";
$multipartbody.= "Content-Type: image/unknown\r\n\r\n";
$multipartbody.= $filecontent . "\r\n";
$multipartbody.= $endMPboundary;
$headers = array(
'Authorization: Basic ' . $user_pwd,
'content-Type: multipart/form-data; boundary=' . $boundary
);
$ci = curl_init();
curl_setopt($ci, CURLOPT_URL, $api_url);
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); //关闭SSL,否则校验证书失败
curl_setopt($ci, CURLOPT_POST, TRUE);
curl_setopt($ci, CURLOPT_POSTFIELDS, $multipartbody);
$curlResponse = curl_exec($ci);
$err = curl_error($ci);
curl_close($ci);
if ($debug) {
logInfo($curlResponse);
if ($err) {
logInfo("cURL Error #:" . $err);
}
}
}
}
}
// 写日志函数
function logInfo($msg) {
$path = get_template_directory();
$logFile = $path.'/sync_weibo.log'; // 日志路径
date_default_timezone_set('Asia/Shanghai');
file_put_contents($logFile, date('[Y-m-d H:i:s]: ') . $msg . PHP_EOL, FILE_APPEND);
return $msg;
}
add_action('publish_post', 'post_to_sina_weibo', 0); //0代表优先级,默认10,最小。
如果把上面的$debug改成true,就会在functions.php同目录下产生sync_weibo.log文件,并查看执行结果日志。
显示结果
发完这个文章,去我的微博看看吧。[Laycher的微博]