慢慢的还是决定快速解决这个问题,一直遗留着不是个事。因此决定早早的搞定这个问题。
毫无疑问,两个小时搞定的效果还是比较好的,虽然多说的API很坑,同样其文章管理也很烂,我只能说我用变通的方式搞定了,但还是不得已删除了所有的旧评论。还好数量不多,在可承受的范围内,实际上是可恢复的如果我想的话,只是不想纠结,就删了。
现在这个 loveyu.net/Message留言页面应该会访问正常了,不会半个月没人理会了。还是不错的。
看图会发现些小问题,地址中的www被多说忽略了,不知道它咋想的,我表示很不可理喻。同样文章管理的问题,有人也提出了,还是8月份来着,看来一直没解决,看来不能报太大的信心。
贴段代码,关于发布这个东西,同样完整代码请移步https://github.com/loveyu/DuoshuoPush
<?php
/**
* 简单的多说回调通知接口
* @author loveyu
* @Link https://loveyu.org/3762.html
*/
/**
* 定义密钥字符串
* 比如: 58fe2e10744dc89adf6945b23438166aa
*/
define( 'D_SECRET', '{Your SECRET}' );
/**
* 自己定义的二级域名
* 比如: loveyu
*/
define( 'D_SHORT_NAME', '{Your short name}' );
/**
* PushBullet 推送KEY
* 比如: zGOfdsfUITvgbdsgBggfdgspg8sSnqWYQwH7ffd
*/
define( 'P_SECRET', '{Your SECRET}' );
/**
* 通知的标题
*/
define( 'D_NOTICE_TITLE', '你的多说有了新评论' );
/**
* @var array $_IGNORE_EMAIL 需要忽略的邮件用户
*/
$_IGNORE_EMAIL = [];
if ( $_SERVER['REQUEST_METHOD'] != "POST" ) {
header( "HTTP/1.1 403 Forbidden" );
die( "Only accept post request." );
}
if ( ! isset( $_POST['action'] ) || ! isset( $_POST['signature'] ) ) {
header( "HTTP/1.1 403 Forbidden" );
die( "POST request parameters error." );
}
/**
* 当前操作类型
*/
define( 'D_ACTION', $_POST['action'] );
/**
* 当前签名
*/
define( 'D_SIGNATURE', $_POST['signature'] );
if ( ! check_signature( $_POST ) ) {
header( "HTTP/1.1 403 Forbidden" );
die( "Signature check error." );
}
$response = get_list( "http://api.duoshuo.com/log/list.json", [ 'short_name' => D_SHORT_NAME, 'secret' => D_SECRET, 'limit' => 1, 'order' => 'desc' ] );
if ( ! isset( $response['response'] ) ) {
echo json_encode( [ 'status' => false, 'msg' => 'no response', 'time' => time() ] );
} else {
$counter = 0;
foreach ( $response['response'] as $log ) {
switch ( $log['action'] ) {
case 'create':
//这条评论是刚创建的
if ( ! in_array( $log['meta']['author_email'], $_IGNORE_EMAIL ) ) {
notice( $log['meta'] );
++ $counter;
}
break;
case 'approve':
//这条评论是通过的评论
break;
case 'spam':
//这条评论是标记垃圾的评论
break;
case 'delete':
//这条评论是删除的评论
break;
case 'delete-forever':
//彻底删除的评论
break;
default:
break;
}
}
echo json_encode( [ 'status' => true, 'action' => D_ACTION, 'record' => count( $response['response'] ), 'counter' => $counter, 'time' => time() ] );
}
/**
* 通知
*
* @param $meta
*/
function notice( $meta ) {
$post_info = get_list( "http://api.duoshuo.com/threads/listPosts.json", [ 'order' => 'asc', 'short_name' => D_SHORT_NAME, 'limit' => 1, 'thread_key' => $meta['thread_key'] ] );
$title = $post_info['thread']['title'];
$url = $post_info['thread']['url'];
$content = "";
if(!empty($title)){
$content.="标题 : {$title}\n";
}
if(!empty($url)){
$content.="地址 : {$url} \n\n";
}
$time = date("Y-m-d H:i:s",strtotime($meta['created_at']));
$content .= <<<HTML
评论内容 :\n
{$meta['message']}
时间 : {$time}
作者 : {$meta['author_name']}
邮箱 : {$meta['author_email']}\n
HTML;
if ( ! empty( $meta['author_url'] ) ) {
$content .= <<<HTML
主页 : {$meta['author_url']}\n
HTML;
}
$content .= <<<HTML
状态 : {$meta['status']}\n
浏览器 : {$meta['agent']}\n
HTML;
/**
* 修改该段的实现,可以实现邮件的通知
*/
_push( null, "note", D_NOTICE_TITLE, $content );
}
/**
* 获取多说的参数
*
* @param $url
* @param $param
*
* @return mixed
*/
function get_list( $url, $param ) {
if ( ! empty( $param ) ) {
$param = array_map( 'urlencode', array_map( 'trim', $param ) );
$list = [ ];
foreach ( $param as $key => $value ) {
$list[] = $key . "=" . urlencode( $value );
}
$url .= "?" . implode( "&", $list );
}
$rt = file_get_contents( $url );
if ( empty( $rt ) ) {
header( "HTTP/1.1 403 Forbidden" );
die( "Get error!" );
}
return json_decode( $rt, true );
}
/**
* 签名检测
*
* @param $input $_POST参数,一般传递
*
* @return bool
*/
function check_signature( $input ) {
$signature = $input['signature'];
unset( $input['signature'] );
ksort( $input );
$baseString = http_build_query( $input, null, '&' );
$expectSignature = base64_encode( hmacsha1( $baseString, D_SECRET ) );
if ( $signature !== $expectSignature ) {
return false;
}
return true;
}
/**
* @param $data
* @param $key
* from: http://www.php.net/manual/en/function.sha1.php#39492
* Calculate HMAC-SHA1 according to RFC2104
* http://www.ietf.org/rfc/rfc2104.txt
*
* @return string
*/
function hmacsha1( $data, $key ) {
if ( function_exists( 'hash_hmac' ) ) {
return hash_hmac( 'sha1', $data, $key, true );
}
$blocksize = 64;
if ( strlen( $key ) > $blocksize ) {
$key = pack( 'H*', sha1( $key ) );
}
$key = str_pad( $key, $blocksize, chr( 0x00 ) );
$ipad = str_repeat( chr( 0x36 ), $blocksize );
$opad = str_repeat( chr( 0x5c ), $blocksize );
$hmac = pack( 'H*', sha1( ( $key ^ $opad ) . pack( 'H*', sha1( ( $key ^ $ipad ) . $data ) ) ) );
return $hmac;
}
/**
* Send a push.
*
* @param string $recipient Recipient of the push.
* @param mixed $type Type of the push notification.
* @param mixed $arg1 Property of the push notification.
* @param mixed $arg2 Property of the push notification.
* @param mixed $arg3 Property of the push notification.
*
* @return object Response.
*/
function _push( $recipient, $type, $arg1, $arg2 = null, $arg3 = null ) {
$PUSH = "https://api.pushbullet.com/v2/pushes";
$queryData = array();
if ( ! empty( $recipient ) ) {
if ( filter_var( $recipient, FILTER_VALIDATE_EMAIL ) !== false ) {
$queryData['email'] = $recipient;
} else {
if ( substr( $recipient, 0, 1 ) == "#" ) {
$queryData['channel_tag'] = substr( $recipient, 1 );
} else {
$queryData['device_iden'] = $recipient;
}
}
}
$queryData['type'] = $type;
switch ( $type ) {
case 'note':
$queryData['title'] = $arg1;
$queryData['body'] = $arg2;
break;
case 'link':
$queryData['title'] = $arg1;
$queryData['url'] = $arg2;
if ( $arg3 !== null ) {
$queryData['body'] = $arg3;
}
break;
case 'address':
$queryData['name'] = $arg1;
$queryData['address'] = $arg2;
break;
case 'list':
$queryData['title'] = $arg1;
$queryData['items'] = $arg2;
break;
default:
return false;
}
return _curlRequest( $PUSH, 'POST', $queryData );
}
/**
* Send a request to a remote server using cURL.
*
* @param string $url URL to send the request to.
* @param string $method HTTP method.
* @param array $data Query data.
* @param bool $sendAsJSON Send the request as JSON.
* @param bool $auth Use the API key to authenticate
*
* @return object Response.
*/
function _curlRequest( $url, $method, $data = null, $sendAsJSON = true, $auth = true ) {
$curl = curl_init();
if ( $method == 'GET' && $data !== null ) {
$url .= '?' . http_build_query( $data );
}
curl_setopt( $curl, CURLOPT_URL, $url );
if ( $auth ) {
curl_setopt( $curl, CURLOPT_USERPWD, P_SECRET );
}
curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, $method );
if ( $method == 'POST' && $data !== null ) {
if ( $sendAsJSON ) {
$data = json_encode( $data );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen( $data ) ) );
}
curl_setopt( $curl, CURLOPT_POSTFIELDS, $data );
}
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HEADER, false );
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, false );
$response = curl_exec( $curl );
if ( $response === false ) {
echo curl_error( $curl );
curl_close( $curl );
return false;
}
$httpCode = curl_getinfo( $curl, CURLINFO_HTTP_CODE );
if ( $httpCode >= 400 ) {
echo curl_error( $curl );
curl_close( $curl );
return false;
}
curl_close( $curl );
return json_decode( $response, true );
}
/**
* 简单的多说回调通知接口
* @author loveyu
* @Link https://loveyu.org/3762.html
*/
/**
* 定义密钥字符串
* 比如: 58fe2e10744dc89adf6945b23438166aa
*/
define( 'D_SECRET', '{Your SECRET}' );
/**
* 自己定义的二级域名
* 比如: loveyu
*/
define( 'D_SHORT_NAME', '{Your short name}' );
/**
* PushBullet 推送KEY
* 比如: zGOfdsfUITvgbdsgBggfdgspg8sSnqWYQwH7ffd
*/
define( 'P_SECRET', '{Your SECRET}' );
/**
* 通知的标题
*/
define( 'D_NOTICE_TITLE', '你的多说有了新评论' );
/**
* @var array $_IGNORE_EMAIL 需要忽略的邮件用户
*/
$_IGNORE_EMAIL = [];
if ( $_SERVER['REQUEST_METHOD'] != "POST" ) {
header( "HTTP/1.1 403 Forbidden" );
die( "Only accept post request." );
}
if ( ! isset( $_POST['action'] ) || ! isset( $_POST['signature'] ) ) {
header( "HTTP/1.1 403 Forbidden" );
die( "POST request parameters error." );
}
/**
* 当前操作类型
*/
define( 'D_ACTION', $_POST['action'] );
/**
* 当前签名
*/
define( 'D_SIGNATURE', $_POST['signature'] );
if ( ! check_signature( $_POST ) ) {
header( "HTTP/1.1 403 Forbidden" );
die( "Signature check error." );
}
$response = get_list( "http://api.duoshuo.com/log/list.json", [ 'short_name' => D_SHORT_NAME, 'secret' => D_SECRET, 'limit' => 1, 'order' => 'desc' ] );
if ( ! isset( $response['response'] ) ) {
echo json_encode( [ 'status' => false, 'msg' => 'no response', 'time' => time() ] );
} else {
$counter = 0;
foreach ( $response['response'] as $log ) {
switch ( $log['action'] ) {
case 'create':
//这条评论是刚创建的
if ( ! in_array( $log['meta']['author_email'], $_IGNORE_EMAIL ) ) {
notice( $log['meta'] );
++ $counter;
}
break;
case 'approve':
//这条评论是通过的评论
break;
case 'spam':
//这条评论是标记垃圾的评论
break;
case 'delete':
//这条评论是删除的评论
break;
case 'delete-forever':
//彻底删除的评论
break;
default:
break;
}
}
echo json_encode( [ 'status' => true, 'action' => D_ACTION, 'record' => count( $response['response'] ), 'counter' => $counter, 'time' => time() ] );
}
/**
* 通知
*
* @param $meta
*/
function notice( $meta ) {
$post_info = get_list( "http://api.duoshuo.com/threads/listPosts.json", [ 'order' => 'asc', 'short_name' => D_SHORT_NAME, 'limit' => 1, 'thread_key' => $meta['thread_key'] ] );
$title = $post_info['thread']['title'];
$url = $post_info['thread']['url'];
$content = "";
if(!empty($title)){
$content.="标题 : {$title}\n";
}
if(!empty($url)){
$content.="地址 : {$url} \n\n";
}
$time = date("Y-m-d H:i:s",strtotime($meta['created_at']));
$content .= <<<HTML
评论内容 :\n
{$meta['message']}
时间 : {$time}
作者 : {$meta['author_name']}
邮箱 : {$meta['author_email']}\n
HTML;
if ( ! empty( $meta['author_url'] ) ) {
$content .= <<<HTML
主页 : {$meta['author_url']}\n
HTML;
}
$content .= <<<HTML
状态 : {$meta['status']}\n
浏览器 : {$meta['agent']}\n
HTML;
/**
* 修改该段的实现,可以实现邮件的通知
*/
_push( null, "note", D_NOTICE_TITLE, $content );
}
/**
* 获取多说的参数
*
* @param $url
* @param $param
*
* @return mixed
*/
function get_list( $url, $param ) {
if ( ! empty( $param ) ) {
$param = array_map( 'urlencode', array_map( 'trim', $param ) );
$list = [ ];
foreach ( $param as $key => $value ) {
$list[] = $key . "=" . urlencode( $value );
}
$url .= "?" . implode( "&", $list );
}
$rt = file_get_contents( $url );
if ( empty( $rt ) ) {
header( "HTTP/1.1 403 Forbidden" );
die( "Get error!" );
}
return json_decode( $rt, true );
}
/**
* 签名检测
*
* @param $input $_POST参数,一般传递
*
* @return bool
*/
function check_signature( $input ) {
$signature = $input['signature'];
unset( $input['signature'] );
ksort( $input );
$baseString = http_build_query( $input, null, '&' );
$expectSignature = base64_encode( hmacsha1( $baseString, D_SECRET ) );
if ( $signature !== $expectSignature ) {
return false;
}
return true;
}
/**
* @param $data
* @param $key
* from: http://www.php.net/manual/en/function.sha1.php#39492
* Calculate HMAC-SHA1 according to RFC2104
* http://www.ietf.org/rfc/rfc2104.txt
*
* @return string
*/
function hmacsha1( $data, $key ) {
if ( function_exists( 'hash_hmac' ) ) {
return hash_hmac( 'sha1', $data, $key, true );
}
$blocksize = 64;
if ( strlen( $key ) > $blocksize ) {
$key = pack( 'H*', sha1( $key ) );
}
$key = str_pad( $key, $blocksize, chr( 0x00 ) );
$ipad = str_repeat( chr( 0x36 ), $blocksize );
$opad = str_repeat( chr( 0x5c ), $blocksize );
$hmac = pack( 'H*', sha1( ( $key ^ $opad ) . pack( 'H*', sha1( ( $key ^ $ipad ) . $data ) ) ) );
return $hmac;
}
/**
* Send a push.
*
* @param string $recipient Recipient of the push.
* @param mixed $type Type of the push notification.
* @param mixed $arg1 Property of the push notification.
* @param mixed $arg2 Property of the push notification.
* @param mixed $arg3 Property of the push notification.
*
* @return object Response.
*/
function _push( $recipient, $type, $arg1, $arg2 = null, $arg3 = null ) {
$PUSH = "https://api.pushbullet.com/v2/pushes";
$queryData = array();
if ( ! empty( $recipient ) ) {
if ( filter_var( $recipient, FILTER_VALIDATE_EMAIL ) !== false ) {
$queryData['email'] = $recipient;
} else {
if ( substr( $recipient, 0, 1 ) == "#" ) {
$queryData['channel_tag'] = substr( $recipient, 1 );
} else {
$queryData['device_iden'] = $recipient;
}
}
}
$queryData['type'] = $type;
switch ( $type ) {
case 'note':
$queryData['title'] = $arg1;
$queryData['body'] = $arg2;
break;
case 'link':
$queryData['title'] = $arg1;
$queryData['url'] = $arg2;
if ( $arg3 !== null ) {
$queryData['body'] = $arg3;
}
break;
case 'address':
$queryData['name'] = $arg1;
$queryData['address'] = $arg2;
break;
case 'list':
$queryData['title'] = $arg1;
$queryData['items'] = $arg2;
break;
default:
return false;
}
return _curlRequest( $PUSH, 'POST', $queryData );
}
/**
* Send a request to a remote server using cURL.
*
* @param string $url URL to send the request to.
* @param string $method HTTP method.
* @param array $data Query data.
* @param bool $sendAsJSON Send the request as JSON.
* @param bool $auth Use the API key to authenticate
*
* @return object Response.
*/
function _curlRequest( $url, $method, $data = null, $sendAsJSON = true, $auth = true ) {
$curl = curl_init();
if ( $method == 'GET' && $data !== null ) {
$url .= '?' . http_build_query( $data );
}
curl_setopt( $curl, CURLOPT_URL, $url );
if ( $auth ) {
curl_setopt( $curl, CURLOPT_USERPWD, P_SECRET );
}
curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, $method );
if ( $method == 'POST' && $data !== null ) {
if ( $sendAsJSON ) {
$data = json_encode( $data );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen( $data ) ) );
}
curl_setopt( $curl, CURLOPT_POSTFIELDS, $data );
}
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HEADER, false );
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, false );
$response = curl_exec( $curl );
if ( $response === false ) {
echo curl_error( $curl );
curl_close( $curl );
return false;
}
$httpCode = curl_getinfo( $curl, CURLINFO_HTTP_CODE );
if ( $httpCode >= 400 ) {
echo curl_error( $curl );
curl_close( $curl );
return false;
}
curl_close( $curl );
return json_decode( $response, true );
}
用IFTTT可以实现这样的功能吗?
刚才大致看了下,应该是可以的。如果有精力去进行编程的话
再次了解了下,最好不要这样折腾,而且IFTTT不适合这样的场景
看来你终于舍得填个靠谱的邮箱地址了。
这个不错,之前找到了一个支持WordPress自带评论功能的Pushbullet推送代码,现在又有多说的了,不过代码看起来好长,好牛B的样子
我现在用的评论就是Pushbullet通知的
所以,就可以各取所需啦!
是的,单独实现了很多。力争最合适
至今不用多说,之前觉得有人回复就通知挺好的,后来觉得烦了就删了这个功能嘿嘿
可能你的回复比较多吧,其实我一直一条评论也没见到。有些系统感觉单独开发个评论系统太麻烦,所以多说走起
看评论说是多说的评论通知,不是可以在网站后台多说设置里面取消吗,取消了就不通知了
其实你们大多没明白我的意思,我指的是你们评论后的通知,而不是回复的通知
过来看看博主
折腾的挺好的
老听api是接口,这个接口到底是个什么东西?
怎么使呢?
就是别人提供一个服务地址,然后你提供相应的认证信息和操作功能,就可以使用别人的接口了,应该是个这样的玩意吧
博主主题很不错呀,I like
谢谢
折腾折腾更好!
能折腾
必须的
想说点什么,但不知说什么好。
对于我们这种写代码的,吱一声我们就知足了
是评论回复么?
是指使用多说的网站,别人评论之后的通知
恩,我觉得好讨厌的,每天回复通知不麻烦么?