本文研究如何利用cPanel的cronjob(时钟守护程序)制作自动发送条目的新浪微博机器人。这里的”微博机器人”指按时发送条目的那种微博程序,比如我自己做的@奥修的金块。暂不讨论像@rtmeme那么高级的。

具体流程是,在新浪开放平台注册一个应用,把微博帐号添加为应用的测试者,完成一系列授权后,用cPanel主机的PHP脚本就可以向微博帐号发送条目了。最后用cronjob把这个过程设为自动执行。

准备工作包括以下几个方面:

  • 支持cronjob的cPanel空间
  • 储存微博条目的MySQL数据库
  • 注册新浪微博应用
  • 处理微博OAuth的PHP库
  • 看看新浪微博开发者协议

此外最好对PHP和MySQL的语法,以及OAuth基本原理有一些粗浅的了解。之后就可以开搞了。

准备数据

微博机器人我见过最多的是报时、发英文或日文单词的,还有各种树洞机器人。大家可以发挥自己的创意~建议文字尽量短小(我发现140字都有人嫌长不看),条目之间相对独立,更新不要太快。测试数据有10多条就行了,成功后再整理正式的。 在cPanel主机当然用PHP+MySQL,在向导中建好数据库,把你的数据导入进去。每一条除了content字段以外,还需要id和count字段,以后管理发送次数时要用到。其余字段看自己需求。

data-in-phpmyadmin.png

数据导入MySQL,最省心的办法是导入整理好的EXCEL表格(第一行写字段名称),折腾了那么久,我只有导入xls时从没乱码过……

注册新浪微博应用

新浪微博开放平台注册页面,点”我是开发者”进入,创建新的”普通应用”,表单随便填一下,这个应用以后就自己使唤,没法过审核的。完后在”编辑应用属性->测试用户”,把微博帐号的UID填进去。最后,记下App Key和App Secret备用。

weibo-app-user.png

weibo-app-key.png

新浪微博OAuth授权

接下来解决OAuth的问题,让我们的应用能够操作自己的微博。首先下载PHP版的新浪微博OAuth库,解压后把刚才记下的App Key和App Secret填在config.php中。

config-php.png

把将要上传的路径填在index.php中替换掉第22行的$callback,完后上传到主机空间。(这些都可以上传完了再改。)

$aurl = $o->getAuthorizeURL( $keys['oauth_token'] ,false , $callback ); //第22行

在浏览器访问刚才上传的地址,比如http://xxxxx.com/weibo-oauth/index.php ,按照提示登录微博并授权给这个应用,之后自动转入http://xxxxx.com/weibo-oauth/weibolist.php 页面,测试一下,可以发送微博就没问题了。

oauth-done.png

用PHP发送微博条目

现在需要改造weibolist.php使其按我们的要求发送微博。看一下weibolist.php就会发现提交微博是在

$rr = $c->update( $_REQUEST['text'] ); //第43行

实现的,那么我们只需要从MySQL中取出数据放在这里就可以。在weibolist.php后面加入以下内容

$conn = mysql_connect('localhost', '数据库管理员名', '管理员密码'); if (!$conn) { die('Could not connect: ' . mysql_error());} mysql_select_db('数据库名'); mysql_query("set names utf8"); $query = "SELECT id,count,content FROM quot WHERE count=(SELECT MIN(count) FROM quot) ORDER BY RAND() LIMIT 1;"; $result=mysql_query($query,$conn); $row=mysql_fetch_array($result); $query2 = "UPDATE quot set count=count+1 WHERE id = ". $row['id'] . ";" ; $result2 = mysql_query($query2,$conn); $c->update( $row['content'] ); echo "index=".$row['id']." / count=".$row['count']."<br/>"; echo $row['content']; echo '----send done';

大体上就是这样,上文提到过记录发送次数的count字段(开始都是0),查询语句就是永远选择当前count最小的数据中随机的一条,并将其count+1。当然纯随机发布或按顺序发布就更简单了,大家可以按自己的需要折腾之。

改好后,每在浏览器刷新这个页面应该会提交一条微博。

之后把weibolist.php中跟浏览器会话(Session)相关的内容替换掉,因为以后用cronjob执行这个PHP文件,那时可没有$_SESSION这玩意。

$c = new WeiboClient( WB_AKEY , WB_SKEY , $_SESSION['last_key']['oauth_token'] , $_SESSION['last_key']['oauth_token_secret'] ); //第8行

怎样知道这两个值呢?有好多办法,比如直接把它写在PHP里,那么从前台就看到了……

<p>token = <?=$_SESSION['last_key']['oauth_token']?></p> <p>token_secret = <?=$_SESSION['last_key']['oauth_token_secret']?></p>

把这段也放在weibolist.php里面,刷新一下就知道token和token_secret,注意这跟应用的App Key/App Secret是两回事。

用cronjob设置自动任务

最后要把这个PHP设成自动运行的,需要用到cPanel的cronjob(时钟守护作业),在cPanel主面板找到这个工具,命令行的语法是

php /home/cPanel帐号名/public_html/刚才页面的地址.php

cronjob.png

跟时间相关的设置按它的提示去选择即可。到这里就全部OK了。最后提醒大家去看看新浪微博的开发者协议,尤其是对机器人式应用的限制。低调行事啊。

(完)


WarmGrid

Answerers: April and Probe