很多国外的朋友都喜欢上推特 Twitter. 但是如果你发了很多推(我有600多条, 但很多都是每天机器自动发的), 在Twitter 上查找以前的推就不是很方便了, 因为用了 Ajax 技术, 没办法一页一页翻. 当然, 你可以在 Twitter 的设置里要求一份备份, 那么你将收到下载的邮件.
更好的办法就是, 我们可以通过 Twitter API 将所有你发的推给存储在你的SQL数据库里, 那么还可以在 博客中显示出来, 更加方便检索. 首先, 我们需要在博客所在的服务器数据库里创建这么一个表, 比如 tweets.
有四个字段: tweet ID, text, date/time, retweet count 分别对应了ID, 文本, 发推的时间, 和被转发的次数. 当然你通过 API statuses/user_timeline 获得的数据还有很多, 但是暂时我只关心这几个值.
备份
我们将写一个PHP脚本, 用于把推给下载下来并写到数据库里:
我们可以用 TwitterOAuth 来访问 Twitter API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support require('TwitterOAuth-1/TwitterOAuth/TwitterOAuth.php'); require('TwitterOAuth-1/TwitterOAuth/Exception/TwitterException.php'); require('TwitterOAuth-1/config.php'); use TwitterOAuth\TwitterOAuth; date_default_timezone_set('UTC'); $config = array( 'consumer_key' => $twitter_apikey, // API key 'consumer_secret' => $twitter_apisecret, // API secret 'oauth_token' => $twitter_accesstoken, // not needed for app only 'oauth_token_secret' => $twitter_accesstokensecret, 'output_format' => 'object' ); $tw = new TwitterOAuth($config); |
// helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support require('TwitterOAuth-1/TwitterOAuth/TwitterOAuth.php'); require('TwitterOAuth-1/TwitterOAuth/Exception/TwitterException.php'); require('TwitterOAuth-1/config.php'); use TwitterOAuth\TwitterOAuth; date_default_timezone_set('UTC'); $config = array( 'consumer_key' => $twitter_apikey, // API key 'consumer_secret' => $twitter_apisecret, // API secret 'oauth_token' => $twitter_accesstoken, // not needed for app only 'oauth_token_secret' => $twitter_accesstokensecret, 'output_format' => 'object' ); $tw = new TwitterOAuth($config);
保存成 twitter.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 | // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support require("twitter.php"); $params = array( 'screen_name' => $twitter_screenname, 'user_id' => $twitter_ownerid, 'count' => 300, 'include_rts' => 1, 'exclude_replies' => false ); $tweets = $tw->get('statuses/user_timeline', $params); mysql_query("SET NAMES utf8"); if(!empty($tweets)) { foreach($tweets as $tweet) { $id = $tweet->id; $retweet_count = (integer)$tweet->retweet_count; $created_at = $tweet->created_at; $text = $tweet->text; $text = mysql_real_escape_string($text); $query = "select count(1) from `tweets` where `id` = '$id'"; $result = mysql_query($query); $cnt = mysql_result($result, 0, 0); if ($cnt == 0) { $query = "insert into `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count'"; } else { $query = "update `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count' where `id`='$id'"; } mysql_query($query); } } |
// helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support require("twitter.php"); $params = array( 'screen_name' => $twitter_screenname, 'user_id' => $twitter_ownerid, 'count' => 300, 'include_rts' => 1, 'exclude_replies' => false ); $tweets = $tw->get('statuses/user_timeline', $params); mysql_query("SET NAMES utf8"); if(!empty($tweets)) { foreach($tweets as $tweet) { $id = $tweet->id; $retweet_count = (integer)$tweet->retweet_count; $created_at = $tweet->created_at; $text = $tweet->text; $text = mysql_real_escape_string($text); $query = "select count(1) from `tweets` where `id` = '$id'"; $result = mysql_query($query); $cnt = mysql_result($result, 0, 0); if ($cnt == 0) { $query = "insert into `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count'"; } else { $query = "update `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count' where `id`='$id'"; } mysql_query($query); } }
mysql_query(“SET NAMES utf8”) 保证了中文字符不会出现乱码. 如果你使用 mb_detect_encoding 你就会发现, 所有通过API得到的文本都是基于 UTF-8 编码的. 重复执行此脚本并不会重复的插入到数据库中, 因为我们通过了 ID 来判断是否重复, 第一次写入, 第二次就是更新了 (比如你的被转发次数会更新)
每次调用API获得推的最大数目是 300. 如果你有多于 300 的推你就需要重复执行脚本, 但是你需要指定一个 max_id 参数用于限定返回推的ID范围.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support $query = "select min(`id`) from `tweets`"; $result = mysql_query($query) or die(mysql_error()); $cnt = mysql_result($result, 0, 0); $params = array( 'screen_name' => $twitter_screenname, 'user_id' => $twitter_ownerid, 'count' => 1000, 'max_id' => $cnt, 'include_rts' => 1, 'exclude_replies' => false ); |
// helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support $query = "select min(`id`) from `tweets`"; $result = mysql_query($query) or die(mysql_error()); $cnt = mysql_result($result, 0, 0); $params = array( 'screen_name' => $twitter_screenname, 'user_id' => $twitter_ownerid, 'count' => 1000, 'max_id' => $cnt, 'include_rts' => 1, 'exclude_replies' => false );
原理就是, 每次我们先检查数据库中最老的推的ID, 然后通过API返回比这条推更老的, 直到所有推都下载下来.
然后我们就可以在 VPS server 上定期执行 这个PHP脚本用于更新到最新的 Tweets (crontab -e)
在博客中分页显示所有推
这个英文页面: helloacm.com/tweets-history/ 就是显示了我所有的推(600多条), 分页显示.
你需要一个插件, 用于在页面中执行PHP脚本, 然后指定PHP代码文件:
[ include ]tweets.php[ / include ]
下面就是tweets.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 | <php // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support global $wpdb; $query = "select count(1) from `tweets`"; $total = $wpdb->get_var($query); $per = 50; $page = get_query_var('page'); if (!$page) { $page = 1; } // pagination $totalpages = ceil($total / $per); if ($page > $totalpages) { $page = 1; } $lowerbound = ($page - 1) * $per; $upperbound = $lowerbound + $per; $lmt=" limit " . $lowerbound . "," . $per; $query = "select * from `tweets` order by `id` desc $lmt"; $result = $wpdb->get_results($query); if ($result) { foreach ($result as $tweet) { $created_at = $tweet->created_at; $text = $tweet->text; $retweet_count = $tweet->retweet_count; // display tweets echo "$text - $created_at"; if ($retweet_count > 0) { echo "($retweet_count Retweeted)"; } } } // show prev/next page links if ($page > 1) { echo "<a href='?page=".($page-1)."'>Newer Tweets</a> - "; } if ($page < $totalpages) { echo "<a href='?page=".($page+1)."'>Older Tweets</a>"; } |
<php // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support global $wpdb; $query = "select count(1) from `tweets`"; $total = $wpdb->get_var($query); $per = 50; $page = get_query_var('page'); if (!$page) { $page = 1; } // pagination $totalpages = ceil($total / $per); if ($page > $totalpages) { $page = 1; } $lowerbound = ($page - 1) * $per; $upperbound = $lowerbound + $per; $lmt=" limit " . $lowerbound . "," . $per; $query = "select * from `tweets` order by `id` desc $lmt"; $result = $wpdb->get_results($query); if ($result) { foreach ($result as $tweet) { $created_at = $tweet->created_at; $text = $tweet->text; $retweet_count = $tweet->retweet_count; // display tweets echo "$text - $created_at"; if ($retweet_count > 0) { echo "($retweet_count Retweeted)"; } } } // show prev/next page links if ($page > 1) { echo "<a href='?page=".($page-1)."'>Newer Tweets</a> - "; } if ($page < $totalpages) { echo "<a href='?page=".($page+1)."'>Older Tweets</a>"; }
可以通过函数 get_query_var(‘page’) 来获得现在显示哪一页推.
也算内容原创了,坐等google来收录.
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK