摘要:微博圖床對于微博圖床的理解得力于這篇文章利用微博當圖床語言實現。源碼如下上傳圖片到微博圖床圖片文件圖片是否采用方式上傳返回的數據微博提交正則表達式提取返回結果中的數據微博機器人源碼列舉了所要用到的幾個重要,最后還是貼一下機器人的源碼吧。
? 在2011年的時候,浙大的一位博士生借助微博的開放平臺為他實驗室的一臺飲水機弄了個微博,名喚@浙大CCNT實驗室飲水機,俗稱“飲水機娘“。當年這條新聞給自己留下了挺大的印象,也一直對這個微博賬號可以自動發微博背后的機理感到十分憧憬。一晃,時間都來到了2019年了~~
? 咳咳——在鉆研不少技術文章以及對技術派網友的多多請教后,自己終于也搗弄了一個自動發微博的機器人( ̄︶ ̄)↗
? 此微博機器人的功能如下:
直接模擬登陸新浪微博;
自動獲取唐詩宋詞文本;
自動獲取文藝主題圖片;
自動上傳圖片至微博圖床;
自動發送內容不同的圖文微博;
通過定時任務,實現周期性發微博任務。
? 實際效果圖:
? GitHub倉庫:
https://github.com/Leslie-Won...
? 正所謂“前不見古人,后不見來者。念天地之悠悠,獨愴然而涕下!“,咳咳——IT技術世界當然不是這樣,我們的技術積累都是站在前人的基礎上的,換言之,站在巨人的肩膀上。所以,還是先來啰嗦啰嗦當年的飲水機娘。
飲水機娘分析? 當年果殼網在飲水機娘爆紅了的時候,采訪了背后的開發者——浙江大學計算機科學與技術學院的一位陳姓博士生。文章標題是《揭開“飲水機娘”的神秘面紗》。在這篇文章中,闡述發微博原理的段落如下:
據陳同學介紹,飲水機本身并沒有多加改造,只是飲水機上安裝一個攝像頭,鏡頭正對加熱指示燈,作為傳感器,實時監控加熱狀態。發送微博的功能通過代碼實現,利用了新浪微博開放平臺提供的PHP語言軟件開發工具包。在代碼的設計中,主要有檢測模塊和反應模塊兩部分。檢測模塊處理攝像頭的監控數據,捕捉加熱指示燈“亮->不亮”與“不亮->亮”兩個切換狀態,然后調用反應模塊及時發送微博。所以在“飲水機娘”自動發送的微博下方,會顯示“來自未通過審核應用”。目前,完成這些功能,所需的代碼量不足兩百行。
? 現在來分析分析這兩段話,把整個流程弄成流程圖的話是如下的效果:
? 從“指示燈”到“視覺算法判斷狀態”這部分屬于計算機視覺實現了,依本人目前的技術視野判斷,可以借助openCV來構建。至于發送微博這一部分,則是純粹的PHP代碼實現。由于本文所要討論的是構建一個發微博的機器人,而微博報文數據的獲取可以有很多種方式,因此,openCV就點到為止了。(自己也不是太懂openCV)(。?_?)/~~~
? 自己在查閱了不少技術文獻后,通過這篇《新浪微博自動(模擬)登陸詳解及實現》了解到飲水機娘發送的微博下方會出現“來自未通過審核應用”是由于用了新浪微博開放平臺的接口的緣故,而且其會有幾個比較致命的限制(調用次數限制和授權期限限制)。網上流傳一種直接模擬登陸微博的解決方案,關鍵點就是利用php的curl功能,這也是本人所要闡述的微博機器人使用的登錄原理。
? 另外,翻了翻飲水機娘最早期發送的微博,報告飲水機水沸騰了的微博報文是這樣子的——
? 后來變成了這樣子——
? 而對應“亮->不亮”狀態的微博報文最初是這樣子的——
? 不過,后來關注度上去之后,就很難判斷飲水機娘發送的微博是不是根據飲水機狀態自動發出去了的了,但是也不影響本文后續的敘述。OK,溯源的部分就到這里,接下來講講在機器人構建中占據不少分量的數據獲取API——今日詩詞API、文藝主題圖片API、微博圖床API。
今日詩詞API? 今日詩詞API是亂碼開發的一個可以返回一句古詩詞名句的接口。它可以通過圖片和JSON格式調用。今日詩詞API根據不同地點、時間、節日、季節、天氣、景觀、城市、事件進行智能推薦。
? 官方文檔地址是https://www.jinrishici.com/, 亂碼大佬撰寫的介紹文章則是https://luan.ma/post/jinrishici/。就本人所要構建的微博機器人而言,使用到的接口是https://v2.jinrishici.com/one...,而且是使用帶token的調用方式。
文藝主題圖片API? 這個圖片API是九凌少子負責開發的,他的圖源來自于360壁紙,主要功能就是根據調用需求,返回一張360壁紙的官方服務器上的圖片URL。調用方式如下:
https://www.yuluoge.com/api/i...
? 不同的cid值對應不同的分類,根據他的解釋及本人測試,分類如下——
cid=0 —— 默認圖片,不分類型
cid=1 —— 美女
cid=2 —— 動漫
cid=3 —— 風景
cid=4 —— 游戲
cid=5 —— 文藝
cid=6 —— 文字控
cid=7 —— 動物
cid=8 —— 愛情
? 此外,這篇文章最后貼出來的源代碼是基于他在今日詩詞的Q群里分享的發微博源碼改造而來的,在此感謝他的貢獻。
微博圖床API? 對于微博圖床API的理解得力于這篇文章——《利用微博當圖床-php語言實現》。
? 使用到的微博圖片上傳接口為
http://picupload.service.weib...
? 本文所構建機器人略有改動地使用了這篇文章里的獲取新浪圖床圖片pid的PHP源碼。源碼如下:
/** * 上傳圖片到微博圖床 * @author mengkun http://mkblog.cn * @param $file 圖片文件/圖片url * @param $multipart 是否采用multipart方式上傳 * @return 返回的json數據 */ function upload($file, $multipart = true) { $cookie = ""; // 微博cookie $url = "http://picupload.service.weibo.com/interface/pic_upload.php" ."?mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog"; if($multipart) { $url .= "&cb=http://weibo.com/aj/static/upimgback.html?_wv=5&callback=STK_ijax_".time(); if (class_exists("CURLFile")) { // php 5.5 $post["pic1"] = new CURLFile(realpath($file)); } else { $post["pic1"] = "@".realpath($file); } } else { $post["b64_data"] = base64_encode(file_get_contents($file)); } // Curl提交 $ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_POST => true, CURLOPT_VERBOSE => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array("Cookie: $cookie"), CURLOPT_POSTFIELDS => $post, )); $output = curl_exec($ch); curl_close($ch); // 正則表達式提取返回結果中的json數據 preg_match("/({.*)/i", $output, $match); if(!isset($match[1])) return ""; return $match[1]; }微博機器人源碼
? 列舉了所要用到的幾個重要API,最后還是貼一下機器人的源碼吧。當然,也有相對應的GitHub倉庫https://github.com/Leslie-Won...
主模塊
//weibo.php true, CURLOPT_VERBOSE => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array("Cookie: $cookie"), CURLOPT_POSTFIELDS => $post, )); $output = curl_exec($ch); curl_close($ch); // 正則表達式提取返回結果中的json數據 preg_match("/({.*)/i", $output, $match); if(!isset($match[1])) return ""; return $match[1]; } /** 通過今日詩詞API獲取詩詞內容 **/ function jinrishici(){ $opts = array( "http"=>array( "method"=>"GET", "header"=>"Accept-language: en "."X-User-Token: k4z4CMgTyl3JN6s+y2iWWiHN6we+0J9V " ) ); $context = stream_context_create($opts); // Open the file using the HTTP headers set above $tangshi_pailie = json_decode(file_get_contents("https://v2.jinrishici.com/one.json", false, $context),true); //今日詩詞API,帶token版本 // $tangshi_pailie = json_decode(file_get_contents("https://v2.jinrishici.com/one.json"), true); //今日詩詞api,不帶token版本 $tangshi_title = $tangshi_pailie["data"]["origin"]["title"]; //標題 $tangshi_dynasty = $tangshi_pailie["data"]["origin"]["dynasty"]; //朝代 $tangshi_author = $tangshi_pailie["data"]["origin"]["author"]; //詩人 $tangshi_line_numbers = count($tangshi_pailie["data"]["origin"]["content"]); $tangshi_content = $tangshi_pailie["data"]["origin"]["content"][0]; for ($i=1; $i < $tangshi_line_numbers; $i++) { $tangshi_temp_line = $tangshi_pailie["data"]["origin"]["content"][$i]; $tangshi_content = $tangshi_content." ".$tangshi_temp_line; } //拼接全詩 $post_Poem = "《".$tangshi_title."》"." ".$tangshi_dynasty."·".$tangshi_author." "." ".$tangshi_content; return "$post_Poem"; } include "./wbcookie.php"; $cookie = $config["cookie"]; //通過圖片api獲取圖片,并轉存微博圖床 $bing_img = json_decode(upload("https://www.yuluoge.com/api/index.php?cid=5", $cookie, false),true); $bing_img_pid = $bing_img["data"]["pics"]["pic_1"]["pid"]; echo "$bing_img_pid "; $tangshi = jinrishici(); echo "$tangshi "; $post=[ "title" =>"今日要說什么?", "location" => "v6_content_home", "text" => "#詩詞[超話]# #中華好詩詞# #中國詩詞大會#"." ".$tangshi." "." ",//需要發送微博的內容 "pic_id" => "$bing_img_pid", // "007CcEyfly1g042kquhztj31ns0u0tdu",//微博圖片id,需事先上傳好 "isReEdit" => false, "pub_source" => "page_2", "topic_id" => "1022%3A", "pub_type" => "dialog", "_t" => 0, "style_type" => 1, ]; $url="https://weibo.com/aj/mblog/add?ajwvr=6&__rnd=2918942797035";//不需要改變 $referer="https://weibo.com/liufengshishe/home?topnav=1&wvr=6";//你的微博用戶名(首頁鏈接) $response = curl($url,$post,"",$cookie,$referer); echo "$response 發送成功";
微博登錄模塊
20*3600||$config["cookie"]=="SUB;") { $cookie = login($sinauser,$sinapwd); if($cookie&&$cookie!="SUB;") { CookieSet($cookie,$time = time()); } else { return error("203","獲取cookie出現錯誤,請檢查賬號狀態或者重新獲取cookie"); } } /** * 新浪微博登錄(無加密接口版本) * @param string $u 用戶名 * @param string $p 密碼 * @return string 返回最有用最精簡的cookie */ function login($u,$p){ $loginUrl = "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543"; $loginData["entry"] = "sso"; $loginData["gateway"] = "1"; $loginData["from"] = "null"; $loginData["savestate"] = "30"; $loginData["useticket"] = "0"; $loginData["pagerefer"] = ""; $loginData["vsnf"] = "1"; $loginData["su"] = base64_encode($u); $loginData["service"] = "sso"; $loginData["sp"] = $p; $loginData["sr"] = "1920*1080"; $loginData["encoding"] = "UTF-8"; $loginData["cdult"] = "3"; $loginData["domain"] = "sina.com.cn"; $loginData["prelt"] = "0"; $loginData["returntype"] = "TEXT"; return loginPost($loginUrl,$loginData); } /** * 發送微博登錄請求 * @param string $url 接口地址 * @param array $data 數據 * @return json 算了,還是返回cookie吧//返回登錄成功后的用戶信息json */ function loginPost($url,$data){ $tmp = ""; if(is_array($data)){ foreach($data as $key =>$value){ $tmp .= $key."=".$value."&"; } $post = trim($tmp,"&"); }else{ $post = $data; } $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$post); $return = curl_exec($ch); curl_close($ch); return "SUB" . getSubstr($return,"Set-Cookie: SUB","; ") . ";"; } /** * 取本文中間 */ function getSubstr($str,$leftStr,$rightStr){ $left = strpos($str, $leftStr); echo "左邊:".$left; $right = strpos($str, $rightStr,$left); echo "
右邊:".$right; if($left <= 0 or $right < $left) return ""; return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr)); } /** 設置cookie文件 */ function CookieSet($cookie,$time){ $newConfig = " "".$cookie."", "time" => "".$time."", );"; @file_put_contents("./wbcookie.php", $newConfig); } /** 錯誤反饋 */ function error($code,$msg){ $arr = array("code"=>$code,"msg"=>$msg); echo json_encode($arr); }
微博賬號模塊
關于如何使用? 本地搭建了lamp環境的話,開啟lamp環境后,直接在瀏覽器地址欄輸入localhost及主入口文件對應的路徑就可以運行了(本人使用xampp)。
? 云服務器的話,本人的方案是使用寶塔服務器面板安裝lamp環境后,使用xftp將文件傳到apache服務器網站根目錄上,開啟lamp環境就可以了的。
關于安全性問題? 實不相瞞,如果是在云服務器上直接跑這些php文件的話,是不太安全的。因為網站的公共用戶具有可以訪問微博賬號文件的權限。所以,推薦對微博賬號文件進行.htaccess設置,也推薦申請個小號來搭建。
? 具體操作有點復雜,可以參考這篇文章——《apache .htaccess文件詳解和配置技巧總結》
關于定時任務? 設置定時任務的話可以使用linux主機的crontab命令。
遠程連接主機,連接成功后,輸入命令crontab -e;
會打開一個文件,按照格式輸入需要執行的腳本;
保存退出后,重啟crontab服務。
語法解釋:
“*” 代表取值范圍內的數字,
參考文獻
“/” 代表”每”,
“-” 代表從某個數字到某個數字,
“,” 分開幾個離散的數字《揭開“飲水機娘”的神秘面紗》《新浪微博自動(模擬)登陸詳解及實現》
《今日詩詞開放接口-調用文檔》
《利用微博當圖床-php語言實現》
《apache .htaccess文件詳解和配置技巧總結》
《linux下crontab定時訪問指定url》
特別致謝九凌少子
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31020.html
摘要:僅供學習交流,請勿用于商業用途,并遵守新浪微博相關規定。代碼目錄此微博機器人的實現功能如下模擬登陸新浪微博獲取自動上傳圖片至微博圖床自動發送內容不同的圖文微博通過定時任務,實現周期性發微博任務。 僅供學習交流,請勿用于商業用途,并遵守新浪微博相關規定。 代碼目錄 showImg(https://segmentfault.com/img/bVbqe6W?w=634&h=580); 此微博...
摘要:今天就用來上傳圖片到微博,這也是來自的一個問題里面還提到一個版本有種方式實現上傳圖片如果要用這個的話參數必須是,值為經過編碼后的字符串。使用上傳登錄微博獲取就是微博圖片,訪問即可打開圖片這里我上傳的是的廣告圖。 微博是個好圖床,上傳后就可以通過一個url來訪問了。今天就用php來上傳圖片到微博,這也是來自sf的一個問題, 里面還提到一個python版本. 有2種方式實現上傳圖片: 如...
摘要:個月后,我通過個產品達到了萬美元的月收入。其中第一個產品貢獻了收入的以上。 .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdow...
摘要:多域名配置原來的域名過期了,重新買了一個,正好重新的配置一下,針對之前寫過的幾個不同的東西,通過不同的子域名來進行區分,因此簡單記錄一下的多域名配置域名配置背景因為資金有限,只有一臺服務器,但是這個服務器上干的事情卻不止一件,當前的狀況是有 nginx多域名配置 原來的域名過期了,重新買了一個hhui.top,正好重新的配置一下,針對之前寫過的幾個不同的東西,通過不同的子域名來進行區分...
摘要:本文轉載自微信公眾號賬號,作者為海航生態科技技術研究院大數據開發工程師高顏。文章介紹了海航生態科技輿情大數據平臺的容器化改造經驗,包括初期技術架構應用容器化架構遷移持續發布與部署。 本文轉載自微信公眾號Docker(賬號:dockerone),作者為海航生態科技技術研究院大數據開發工程師高顏。 文章介紹了海航生態科技輿情大數據平臺的容器化改造經驗,包括初期技術架構、應用容器化、架構遷...
閱讀 994·2023-04-25 14:41
閱讀 2445·2021-09-28 09:35
閱讀 3619·2019-08-30 15:53
閱讀 1940·2019-08-29 15:26
閱讀 1060·2019-08-28 17:59
閱讀 4229·2019-08-26 13:45
閱讀 2835·2019-08-26 13:33
閱讀 1639·2019-08-26 11:46