自己的网站建立两年有余,现在没啥精力更新,移动浪潮袭来,web应用式微,网站的流量越来越少。前段时间再次看到关于“流量为王”的网站发展传说,于是打算把之前发布的网站文章链接分享到新浪微博和Facebook,多多少少去引入点流量。
1、微博自动发布
根据微博API接口资料,通过API发布微博需要Oauth登陆
因为我计划通过Linux服务器crontab定时发布,且是免登陆的自动发布,所以首先需要微博用户(我使用开发者本人的微博)登陆并获取access_token(7天有效)。
获取access_token的方法可以参考这里祺爸PiscDong / weibo_PHP
使用祺爸PiscDong / weibo_PHP 代码的demo.php实例获取access_token
<?php session_start(); //此示例中要使用session require_once('config.php'); require_once('sina.php'); function getimgp($u){ //图片处理 $c=@file_get_contents($u); $name=md5($u).'.jpg'; $mime='image/unknown'; return array($mime, $name, $c); } $sina_t=isset($_SESSION['sina_t'])?$_SESSION['sina_t']:''; //检查是否已登录 if($sina_t!=''){ $sina=new sinaPHP($sina_k, $sina_s, $sina_t); //获取登录用户id $sina_uid=$sina->get_uid(); $uid=$sina_uid['uid']; //获取登录用户信息 $result=$sina->show_user_by_id($uid); var_dump($result); /** //发布微博 $content='微博内容'; $img='http://www.baidu.com/img/baidu_sylogo1.gif'; $img_a=getimgp($img); if($img_a[2]!=''){ $result=$sina->update($content, $img_a); //发布带图片微博 }else{ $result=$sina->update($content); //发布纯文字微博 } var_dump($result); **/ /** //微博列表 $result=$sina->user_timeline($uid); var_dump($result); **/ /** //其他功能请根据官方文档自行添加 //示例:根据uid获取用户信息 $result=$sina->api('users/show', array('uid'=>$uid), 'GET'); var_dump($result); **/ }else{ //生成登录链接 $sina=new sinaPHP($sina_k, $sina_s); $login_url=$sina->login_url($callback_url); echo '<a href="',$login_url,'">点击进入授权页面</a>'; }
获取成功后,因为access_token 7天内有效,可以直接把该access_token当做参数,通过API直接发布,代码示例如下:
<?php session_start(); //此示例中要使用session require_once('config.php'); require_once('sina.php'); function getimgp($u){ //图片处理 $c=@file_get_contents($u); $name=md5($u).'.jpg'; $mime='image/unknown'; return array($mime, $name, $c); } $sina_k='xxxxxxxxxxxx'; //新浪微博应用App Key $sina_s='xxxxxxxxxxxx'; //新浪微博应用App Secret $sina_t='xxxxxxxxxxxx'; //登录用户的Access_Token //发布微博 $content='微博内容'; $img='http://www.baidu.com/img/baidu_sylogo1.gif'; $img_a=getimgp($img); if($img_a[2]!=''){ $result=$sina->update($content, $img_a); //发布带图片微博 }else{ $result=$sina->update($content); //发布纯文字微博 } var_dump($result); ?>
因为打算利用Linux Crontab定时发布,编写了如下Shell代码
#!/bin/sh tl="/home/wwwroot/xxx/sitemap.txt" #!sitemap为我需要发布网址列表 tl2=$(head -1 $tl) #!读取txt文件第一行 sleep 2s tl3="http://xxx.com/demo2.php?url="$tl2"" /usr/local/bin/lynx -source $tl3 #!通过lynx模拟浏览器访问,同时向php网页传参 sleep 10s sed -i '1d' $tl #!删除txt文件第一行 sleep 4s
另外我尝试了使用simple_html_dom.php这个库简单爬取网页信息,作为微博内容,自动发布。爬虫的使用办法可以参考这里http://blog.sina.com.cn/s/blog_5fd841bf0100dqk2.html
2、facebook自动发布到粉丝页面上
第一次尝试参考《讓使用者免登入直接透過 Facebook API 發佈訊息到粉絲頁上》http://blog.chrisflicker.com/post/88074551173办法自动发布,后google得知此方法已失效。
最后在http://stackoverflow.com/(点击打开)找到了正确的代码。
摘录如下(该答案作者不但给出了使用Facebook原生SDK自动发布的办法,并提供获取永久Access_Token的办法,链接)
session_start(); define('FACEBOOK_SDK_V4_SRC_DIR', 'facebook-php-sdk-v4-4.0-dev/src/Facebook/'); require __DIR__ . '/facebook-php-sdk-v4-4.0-dev/autoload.php'; use Facebook\FacebookSession; use Facebook\FacebookRequest; use Facebook\GraphUser; use Facebook\FacebookRequestException; use Facebook\FacebookRedirectLoginHelper; // Facebook App $api_key = 'xxxxxxxxxxxxxxxx'; //App ID $api_secret = 'xxxxxxxxxxxxxxxx'; //App Secret $page_id = 'xxxxxxxxxxxxxxxx'; //Page ID $page_token = 'from the steps in the url'; $fb_post = array( 'message'=> 'test message', 'name'=> '', 'link'=> 'http://www.example.com/', 'picture'=> 'http://www.example.com/image.jpg', 'caption'=> '', ); // start a session for this App FacebookSession::setDefaultApplication($api_key, $api_secret); try { $session = new FacebookSession($page_token); } catch(FacebookRequestException $e) { die(" Error : " . $e->getMessage()); } catch(\Exception $e) { die(" Error : " . $e->getMessage()); } try { // Auto posting $page_post = (new FacebookRequest( $session, 'POST', '/'. $page_id .'/feed', $fb_post))->execute()->getGraphObject()->asArray(); // return post_id, optional print_r( $page_post ); } catch (FacebookRequestException $e) { // The Graph API returned an error echo '<b style="color:blue;">'.$e->getMessage().'</b>'; } catch (\Exception $e) { // Some other error occurred echo '<b style="color:red;">'.$e->getMessage().'</b>'; }
另外这一次我尝试了使用curl来简单爬取网页Meta信息,作为Facebook相关内容,自动发布。curl爬网页Meta使用办法可以参考这里使用curl获取页面的meta中keywords和description
<?php /** * 使用cURL获取一个网页中的 keyword 和 description 部分 * * @param str $ 查询的url地址 * @return array array('keyword'=>keyword部分,'description'=>description部分) */ function curl_getkd($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $html = curl_exec($ch); $info = curl_getinfo($ch); if ($html === false) { echo "cURL Error: " . curl_error($ch); } curl_close($ch); preg_match_all("/<meta[^>]+name=\"([^\"]*)\"[^>]" . "+content=\"([^\"]*)\"[^>]*>/i", $html, $r, PREG_PATTERN_ORDER); for ($i = 0;$i < count($r[1]);$i++) { if (strtolower($r[1][$i]) == "keywords") $meta['keywords'] = $r[2][$i]; if (strtolower($r[1][$i]) == "description") $meta['description'] = $r[2][$i]; } return $meta; } // 测试 $r = curl_getkd('http://www.qq.com/'); echo '<pre>'; print_r($r); echo '</pre>'; // 输出 /** Array ( [keywords] => …… [description] => …… ) */ ?>
后记:
由于自己从没写过分享教程类的文章,而且php是自学的三脚猫水平。各位看官见谅。
通过最近这次学习(百度+google找答案,边试边改的模式),学到了Oauth登录,API使用,Shell代码编写,Crontab服务的使用,第三方爬虫simple_html_dom及Curl爬网页等方面的一些知识。另外http://stackoverflow.com/对于查找编程问题解决办法非常有效!
完。