新浪微博自动推送美图
这是一个通过Sae的服务和微博的API实现的 微博自动推送美图 应用。
[如何新建一个应用]
先去微博的开放平台[https://open.weibo.com/]创建一个“网页应用”,在管理中心加入应用的管理页。
点击左侧的“应用信息”,再进入“高级信息”。
然后在“授权回调页”的地址上加上“https://你的应用名称.sinaapp.com/key.php”
下面是代码:
Config.php 配置文件
<?php header('Content-Type: text/html; charset=UTF-8'); $mysql = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); mysql_query('use 数据库名称'); mysql_query('set names utf8'); $storage = 'storage名称'; $copy = ' 本图片来自 美图推送'; function images_type($type){ switch($type){ case 'image/jpg': return 'jpg'; break; case 'image/jpeg': return 'jpg'; break; case 'image/png': return 'png'; break; /*case 'image/gif': return 'gif'; break;*/ } } define('APP_Key', '应用的APP_Key'); define('APP_Secret', '应用的APP_Secret'); define('Call_Back', '应用的授权回调地址'); define('IMAGE_WIDTH', 280);//图片最小的宽度 define('IMAGE_HEIGHT', 280);//图片最小的高度 ?>
[如何才能获得应用的Key]
在管理中心的应用页里面可以找到!
Index.php 应用首页 用于跳转授权页
<?php session_start(); include 'config.php'; include 'saetv2.ex.class.php'; $weibo = new SaeTOAuthV2(APP_Key, APP_Secret); $code_url = $weibo->getAuthorizeURL(Call_Back); echo '<script>location.href="'.$code_url.'";</script>'; ?>
Key.php 应用授权页 用于授权
<?php session_start(); include 'config.php'; include 'saetv2.ex.class.php'; $weibo = new SaeTOAuthV2(APP_Key, APP_Secret); if(isset($_REQUEST['code'])){ $keys = array(); $keys['code'] = $_REQUEST['code']; $keys['redirect_uri'] = Call_Back; try { $token = $weibo->getAccessToken( 'code', $keys ) ; }catch (OAuthException $error) { } } if($token){ $_SESSION['token'] = $token; setcookie( 'weibojs_'.$o->client_id, http_build_query($token) ); echo '<script>alert("授权完成");location.href="add.php";</script>'; }else{ echo '<script>alert("授权失败");</script>'; } ?>
Catch.php 图片抓取
<?php exit; include 'config.php'; $sort = array('games?q=CG', 'games?q=人设', 'games?q=卡牌', 'beauty'); foreach($sort as $index => $values){ $catch_url = 'https://huaban.com/favorite/'.$values.'/'; $box[] = catch_pic($catch_url, $values); } for($i = 0; $i<count($box); $i++){ for($j = 0; $j<count($box[$i]); $j++){ $main[] = $box[$i][$j]; } } unset($box); shuffle($main); //print_r($main); /*** * 写入数据库 ***/ $num = count($main); for($i = 0; $i < $num; $i++){ $name = rand(100000,999999); mysql_query('insert into picture values(0, "'.$main[$i]['sort'].'_'.$name.'", "hasn\'t share key", "'.date('Y-m-d H:i:s').'", "'.$main[$i]['sort'].'", "'.$main[$i]['type'].'","true", "'.$main[$i]['key'].'")'); } echo '<p>任务完成</p>'; /*** * Function Catch_Pic ***/ function catch_pic($catch_url, $sort){ /*** * 抓取链接 ***/ $f = new SaeFetchurl(); $page = $f->fetch($catch_url); preg_match_all('/(?<=app\.page\[\"pins\"\] = \[)([\d\D]*?)(?=app\.page\[\"promotions\"\])/', $page, $box); $json = $box[0]; preg_match_all('/(?<=\"key\"\:\")([\d\D]*?)(?=\"\,)/', $json[0], $box); $key = $box[0]; preg_match_all('/(?<=\"type\"\:\")([\d\D]*?)(?=\"\,)/', $json[0], $box); $type = $box[0]; /*** * 验证数组 ***/ if(count($key) == count($type)){ $num = count($key); }else{ echo '<p>抓取出错</p>'; exit; } /*** * 整合数组 ***/ unset($box); unset($main); for($i = 0; $i < $num; $i++){ $images_type = images_type($type[$i]); if($images_type){ $box[$i]['key'] = $key[$i]; $box[$i]['sort'] = $sort; if(strstr($box[$i]['sort'], '?')){ preg_match_all('/([\d\D]*?)(?=\?)/', $box[$i]['sort'], $main); $box[$i]['sort'] = $main[0][0]; } $box[$i]['type'] = $images_type; }else{ unset($box[$i]); } } sort($box); return $box; //print_r($box); } ?>
Show.php 调用图片
<?php include 'config.php'; if($_GET['share']!=''){ $select = mysql_fetch_array(mysql_query('select * from picture where share = "'.$_GET['share'].'"')); $stor = new SaeStorage(); $img_data = $stor->read($storage, substr($select['date'], 0, 10).'/'.$select['share'].'.'.$select['suffix']); if($img_data!=''){ $img = new SaeImage($img_data); $font = array("name"=>SAE_MicroHei, "size"=>10, "weight"=>180, "color"=>"#ffffff"); $img->annotate($copy, 1, SAE_SouthWest, $font); header('Content-type: image/'.$select['suffix']); $img->exec($select['suffix'], true); } } ?>
Add.php 发布微博
<?php if($_GET['key']==''){ exit; } session_start(); include 'config.php'; include 'saetv2.ex.class.php'; /*** * SaeTOAuthV2 ***/ $weibo = new SaeTOAuthV2(APP_Key, APP_Secret); /*** * 手动更新Key ***/ //mysql_query('update user set token ="'.$_SESSION['token']['access_token'].'" where id = 1'); //exit; /*** * SaeTClientV2 ***/ $select = mysql_fetch_array(mysql_query('select * from user where id = 1')); $pic_id = $select['num']; $token = $select['token']; $weibo = new SaeTClientV2(APP_Key, APP_Secret, $token); $ms = $weibo->home_timeline(); $uid_get = $weibo->get_uid(); $uid = $uid_get['uid']; $user_message = $weibo->show_user_by_id($uid); echo '<p>'.$user_message['screen_name']; /*** * 读取数量 ***/ unset($select); while(is_null($select[0])){ $select = mysql_fetch_array(mysql_query('select * from picture where id = '.$pic_id)); if(is_null($select[0])){ $pic_id++; } } $pic_max = mysql_fetch_array(mysql_query('select max(id) from picture')); /*** * 写入图片 ***/ if($pic_id <= $pic_max[0]){ $stor = new SaeStorage(); $f = new SaeFetchurl(); unset($img_data); while($img_data == ''){ $img_data = $f->fetch('https://img.hb.aicdn.com/'.$select['key'].'_fw658'); } if($img_data != ''){ $image = new SaeImage($img_data); $image_info = $image->getImageAttr(); if($image_info[0]>=IMAGE_WIDTH && $image_info[1]>=IMAGE_HEIGHT){ $share = md5(md5($img_data)); mysql_query('update picture set share = "'.$share.'", date = "'.date('Y-m-d H:i:s').'" where id='.$select['id']); $name = date('Y-m-d').'/'.$share.'.'.$select['suffix']; $stor->write($storage, $name, $img_data); }else{ mysql_query('delete from picture where id='.$pic_id); mysql_query('update user set num = '.($pic_id+1).' where id = 1'); echo ':图片大小不符合'; exit; } }else{ mysql_query('update user set num = '.$pic_id.' where id = 1'); echo ':数据抓取失败'; exit; } /*** * 发表微博 ***/ unset($img_data); $img_data = $f->fetch('https://msae.sinaapp.com/show.php?share='.$share); if($img_data!=''){ $box = $weibo->upload('#美图推送# Hi!我是推送君,请多多包涵~', 'https://msae.sinaapp.com/show.php?share='.$share); if(isset($box['error_code']) && $box['error_code'] > 0){ echo ":微博发送失败,错误:{$box['error_code']}:{$box['error']}"; }else{ $select = mysql_query('update user set num = '.($pic_id+1).' where id = 1'); /*if($select!='true'){ unset($select); while($select!='true'){ $select = mysql_query('update user set num = '.($pic_id+1).' where id = 1'); } }*/ if($select){ echo ":微博发送成功"; }else{ echo ':数据库出错'; } } }else{ echo ':Storage拉取出错'; } }else{ echo ':数据抓取失败'; } ?>
除了PHP外,我们还要用到MySql数据库来存放图片信息和用户信息。
Table Picture 存放图片信息
CREATE TABLE IF NOT EXISTS `picture` ( `id` int(25) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `share` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `date` datetime NOT NULL, `sort` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `suffix` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `key` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key` (`key`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Table User 存放用户信息
CREATE TABLE IF NOT EXISTS `user` ( `id` int(25) NOT NULL AUTO_INCREMENT, `num` int(25) NOT NULL, `token` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
还有最重要的计划任务(在Config.yaml里面加入):
cron: - description: cron_catch url: /catch.php schedule: "*/1 * * * *" - description: cron_add url: /add.php schedule: "*/1 * * * *"
[数据表如何使用]
按照上面的表结构建好表后,在User表中插入以下数据:
INSERT INTO `user` (`id`, `num`, `token`) VALUES (1, 1, '新浪API的授权密匙');
[如何获得新浪API的授权密匙]
在 Add.php 文件里面有个“手动更新Key”的注释,注释下面有2行代码。
把注释删掉然后访问 Add.php 文件即可自动将密匙加入数据库。
加入了数据库后记得把那两行代码注释掉,否则无法使用下面的代码!!
[效果预览]
请翻看旧的微博:https://weibo.com/312388450
That's way the betsset answer so far!