mirror of
https://github.com/lkeme/BiliHelper-personal.git
synced 2025-12-19 17:40:07 +08:00
Merge pull request #51 from lu79432/master
[merge] DynamicForward-alpha
This commit is contained in:
commit
84110b2e75
1
.gitignore
vendored
1
.gitignore
vendored
@ -17,6 +17,7 @@ gen
|
|||||||
/configs/
|
/configs/
|
||||||
/tests/
|
/tests/
|
||||||
config
|
config
|
||||||
|
/conf/user*.conf
|
||||||
*.log
|
*.log
|
||||||
Traits/
|
Traits/
|
||||||
README1.md
|
README1.md
|
||||||
|
|||||||
@ -79,6 +79,13 @@ COMPET_STAKE=1
|
|||||||
# 风纪委员
|
# 风纪委员
|
||||||
USE_JUDGE=false
|
USE_JUDGE=false
|
||||||
|
|
||||||
|
# 自动转发抽奖动态
|
||||||
|
AUTO_DYNAMIC = false
|
||||||
|
# 自动取关未中奖动态
|
||||||
|
CLEAR_DYNAMIC = false
|
||||||
|
# 强制清除抽奖组关注
|
||||||
|
CLEAR_GROUP_FOLLOW = false
|
||||||
|
|
||||||
#######################
|
#######################
|
||||||
# 基础设置 #
|
# 基础设置 #
|
||||||
#######################
|
#######################
|
||||||
|
|||||||
@ -92,6 +92,7 @@ class App
|
|||||||
'AnchorRaffle',
|
'AnchorRaffle',
|
||||||
'AwardRecord',
|
'AwardRecord',
|
||||||
'Statistics',
|
'Statistics',
|
||||||
|
'Forward'
|
||||||
];
|
];
|
||||||
foreach ($plugins as $plugin) {
|
foreach ($plugins as $plugin) {
|
||||||
$this->newTask($plugin);
|
$this->newTask($plugin);
|
||||||
|
|||||||
238
src/plugin/Dynamic.php
Normal file
238
src/plugin/Dynamic.php
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @blog http://blog.jianxiaodai.com
|
||||||
|
* @author 菜如狗怎么了
|
||||||
|
* @date 2020-12
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace BiliHelper\Plugin;
|
||||||
|
|
||||||
|
|
||||||
|
use BiliHelper\Core\Curl;
|
||||||
|
|
||||||
|
class Dynamic
|
||||||
|
{
|
||||||
|
// 228584 14027 434405 7019788 3230836
|
||||||
|
private static $topic_list = [
|
||||||
|
3230836 => '',
|
||||||
|
434405 => '',
|
||||||
|
7019788 => ''
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
private static $article_list = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取抽奖话题下的帖子
|
||||||
|
*/
|
||||||
|
public static function getAwardTopic()
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach (self::$topic_list as $t_id => $t_name) {
|
||||||
|
$url = 'https://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_new?topic_id=' . $t_id;
|
||||||
|
$data = Curl::request('get', $url);
|
||||||
|
$data = json_decode($data, true);
|
||||||
|
|
||||||
|
// new
|
||||||
|
foreach ($data['data']['cards'] as $article) {
|
||||||
|
$article_id = $article['desc']['dynamic_id'];
|
||||||
|
$item = [
|
||||||
|
'uid' => $article['desc']['uid'],
|
||||||
|
'rid' => $article['desc']['rid'],
|
||||||
|
'did' => $article_id,
|
||||||
|
'tm' => $article['desc']['timestamp'],
|
||||||
|
];
|
||||||
|
|
||||||
|
self::$article_list[$article_id] = $item;
|
||||||
|
}
|
||||||
|
// $has_more = 0;
|
||||||
|
// more ??
|
||||||
|
// https://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_history?topic_name=转发抽奖&offset_dynamic_id=454347930068783808
|
||||||
|
}
|
||||||
|
return self::$article_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 动态转发
|
||||||
|
* @param $rid
|
||||||
|
* @param string $content
|
||||||
|
* @param int $type
|
||||||
|
* @param int $repost_code
|
||||||
|
* @param string $from
|
||||||
|
* @param string $extension
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function dynamicRepost($rid, $content = "", $type = 1, $repost_code = 3000, $from = "create.comment", $extension = '{"emoji_type":1}')
|
||||||
|
{
|
||||||
|
$user_info = User::parseCookies();
|
||||||
|
$url = "https://api.vc.bilibili.com/dynamic_repost/v1/dynamic_repost/reply";
|
||||||
|
$payload = [
|
||||||
|
"uid" => $user_info['uid'],
|
||||||
|
"rid" => $rid,
|
||||||
|
"type" => $type,
|
||||||
|
"content" => $content,
|
||||||
|
"extension" => $extension,
|
||||||
|
"repost_code" => $repost_code,
|
||||||
|
"from" => $from,
|
||||||
|
];
|
||||||
|
$raw = Curl::post('app', $url, $payload);
|
||||||
|
$de_raw = json_decode($raw, true);
|
||||||
|
if ($de_raw['code'] == 0 && isset($de_raw['data'])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发表评论
|
||||||
|
* @param int $rid
|
||||||
|
* @param string $message
|
||||||
|
* @param int $type
|
||||||
|
* @param int $plat
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function dynamicReplyAdd($rid, $message = "", $type = 11, $plat = 1)
|
||||||
|
{
|
||||||
|
$user_info = User::parseCookies();
|
||||||
|
$url = "https://api.bilibili.com/x/v2/reply/add";
|
||||||
|
$payload = [
|
||||||
|
"oid" => $rid,
|
||||||
|
"plat" => $plat,
|
||||||
|
"type" => $type,
|
||||||
|
"message" => $message,
|
||||||
|
"csrf" => $user_info['token'],
|
||||||
|
];
|
||||||
|
$raw = Curl::post('app', $url, $payload);
|
||||||
|
$de_raw = json_decode($raw, true);
|
||||||
|
if ($de_raw['code'] == 0 && isset($de_raw['data'])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除指定动态
|
||||||
|
* @param $did
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function removeDynamic($did)
|
||||||
|
{
|
||||||
|
$user_info = User::parseCookies();
|
||||||
|
$url = 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic';
|
||||||
|
$payload = [
|
||||||
|
"dynamic_id" => $did,
|
||||||
|
"csrf_token" => $user_info['token'],
|
||||||
|
];
|
||||||
|
$raw = Curl::post('app', $url, $payload);
|
||||||
|
$de_raw = json_decode($raw, true);
|
||||||
|
if ($de_raw['code'] == 0 && isset($de_raw['data'])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取个人发布的动态
|
||||||
|
* @param int $uid
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function getMyDynamic($uid = 0)
|
||||||
|
{
|
||||||
|
$user_info = User::parseCookies();
|
||||||
|
$uid = $uid == 0 ? $user_info['uid'] : $uid;
|
||||||
|
$url = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history";
|
||||||
|
$offset = '';
|
||||||
|
$has_more = true;
|
||||||
|
$card_list = [];
|
||||||
|
while ($has_more) {
|
||||||
|
$payload = [
|
||||||
|
"host_uid" => $uid,
|
||||||
|
"need_top" => 1,
|
||||||
|
"offset_dynamic_id" => $offset,
|
||||||
|
];
|
||||||
|
$raw = Curl::get('app', $url, $payload);
|
||||||
|
$de_raw = json_decode($raw, true);
|
||||||
|
$has_more = $de_raw['data']['has_more'] == 1;
|
||||||
|
if (!isset($de_raw['data']['cards'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$card_list = array_merge($card_list, $de_raw['data']['cards']);
|
||||||
|
foreach ($de_raw['data']['cards'] as $card) {
|
||||||
|
$offset = $card['desc']['dynamic_id_str'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $card_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取动态详情
|
||||||
|
* @param $did
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function getDynamicDetail($did)
|
||||||
|
{
|
||||||
|
$url = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail";
|
||||||
|
$payload = [
|
||||||
|
"dynamic_id" => $did,
|
||||||
|
];
|
||||||
|
$raw = Curl::get('app', $url, $payload);
|
||||||
|
return json_decode($raw, true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取抽奖动态信息
|
||||||
|
* @param $did
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function getLotteryNotice($did)
|
||||||
|
{
|
||||||
|
$url = 'https://api.vc.bilibili.com/lottery_svr/v1/lottery_svr/lottery_notice';
|
||||||
|
$payload = [
|
||||||
|
"dynamic_id" => $did,
|
||||||
|
];
|
||||||
|
$raw = Curl::get('app', $url, $payload);
|
||||||
|
return json_decode($raw, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取个人动态TAB列表
|
||||||
|
* @param int $uid
|
||||||
|
* @param int $type_list
|
||||||
|
* @return array|mixed
|
||||||
|
*/
|
||||||
|
public static function getDynamicTab($uid = 0, $type_list = 268435455)
|
||||||
|
{
|
||||||
|
$user_info = User::parseCookies();
|
||||||
|
$uid = $uid == 0 ? $user_info['uid'] : $uid;
|
||||||
|
$url = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new";
|
||||||
|
$offset = '';
|
||||||
|
$has_more = true;
|
||||||
|
$card_list = [];
|
||||||
|
while ($has_more) {
|
||||||
|
$payload = [
|
||||||
|
"uid" => $uid,
|
||||||
|
"type_list" => $type_list,
|
||||||
|
"offset_dynamic_id" => $offset,
|
||||||
|
];
|
||||||
|
$raw = Curl::get('app', $url, $payload);
|
||||||
|
$de_raw = json_decode($raw, true);
|
||||||
|
if (!isset($de_raw['data']['cards'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$card_list = $de_raw['data']['cards'];
|
||||||
|
$has_more = $de_raw['data']['has_more'] == 1;
|
||||||
|
foreach ($de_raw['data']['cards'] as $card) {
|
||||||
|
$offset = $card['desc']['dynamic_id_str'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $card_list;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
239
src/plugin/Forward.php
Normal file
239
src/plugin/Forward.php
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @Blog http://blog.jianxiaodai.com
|
||||||
|
* @author 菜如狗怎么了
|
||||||
|
* @date 2020-12
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace BiliHelper\Plugin;
|
||||||
|
|
||||||
|
|
||||||
|
use BiliHelper\Core\Log;
|
||||||
|
use BiliHelper\Util\TimeLock;
|
||||||
|
|
||||||
|
class Forward
|
||||||
|
{
|
||||||
|
use TimeLock;
|
||||||
|
|
||||||
|
public static $default_follows = [];
|
||||||
|
|
||||||
|
public static $un_follows = [];
|
||||||
|
public static $del_dynamic = [];
|
||||||
|
|
||||||
|
public static $already = [];
|
||||||
|
|
||||||
|
private static $group_name = "氪可改命";
|
||||||
|
|
||||||
|
private static $group_id = null;
|
||||||
|
|
||||||
|
private static $msg = '从未中奖,从未放弃[doge]';
|
||||||
|
|
||||||
|
|
||||||
|
public static function run()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (self::getLock() > time()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::setPauseStatus();
|
||||||
|
if (!self::start()) {
|
||||||
|
self::setLock(60 * 60);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::setLock(5 * 60);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static function start()
|
||||||
|
{
|
||||||
|
|
||||||
|
// 取关未中奖
|
||||||
|
if (getenv('CLEAR_DYNAMIC') == 'true') {
|
||||||
|
self::clearDynamic();
|
||||||
|
}
|
||||||
|
// 自动转发关注评论
|
||||||
|
if (getenv('AUTO_DYNAMIC') == 'true') {
|
||||||
|
self::autoRepost();
|
||||||
|
}
|
||||||
|
// 强制清除抽奖关注组
|
||||||
|
if (getenv('CLEAR_GROUP_FOLLOW') == 'true') {
|
||||||
|
self::clearAllDynamic();
|
||||||
|
self::clearFollowGroup();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动转发抽奖
|
||||||
|
*/
|
||||||
|
public static function autoRepost()
|
||||||
|
{
|
||||||
|
$article_list = Dynamic::getAwardTopic();
|
||||||
|
foreach ($article_list as $did => $article) {
|
||||||
|
|
||||||
|
if (isset(self::$already[$did])) {
|
||||||
|
//重复
|
||||||
|
Log::info("[动态抽奖]-已转发 跳过: {$did} {$article['uid']}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 评论
|
||||||
|
Log::info("[动态抽奖]-评论: {$did} {$article['rid']}");
|
||||||
|
if (Dynamic::dynamicReplyAdd($article['rid'], self::$msg)) {
|
||||||
|
// 转发
|
||||||
|
Log::info("[动态抽奖]-转发: {$did}");
|
||||||
|
if (Dynamic::dynamicRepost($did, self::$msg)) {
|
||||||
|
// 关注
|
||||||
|
Log::info("[动态抽奖]-关注: {$did} {$article['uid']}");
|
||||||
|
self::addToGroup($article['uid']); //
|
||||||
|
self::$already[$did] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理无效的动态
|
||||||
|
*/
|
||||||
|
private static function clearDynamic()
|
||||||
|
{
|
||||||
|
$dynamicList = Dynamic::getMyDynamic();
|
||||||
|
|
||||||
|
Log::info("[动态抽奖]-检测中奖 动态数: " . count($dynamicList));
|
||||||
|
foreach ($dynamicList as $dynamic) {
|
||||||
|
$flag = false;
|
||||||
|
$msg = '';
|
||||||
|
$did = $dynamic['desc']['dynamic_id'];
|
||||||
|
$card = json_decode($dynamic['card'], true);
|
||||||
|
|
||||||
|
|
||||||
|
if (isset($card["item"]["miss"]) && $card["item"]["miss"] == 1) {
|
||||||
|
$flag = true;
|
||||||
|
$msg = "[动态抽奖]-删除动态 源动态已删除 {$did}";
|
||||||
|
}
|
||||||
|
if (isset($card["origin_extension"]['lott'])) {
|
||||||
|
$lott = json_decode($card["origin_extension"]["lott"], true);
|
||||||
|
if (isset($lott["lottery_time"]) && $lott["lottery_time"] <= time()) {
|
||||||
|
$flag = true;
|
||||||
|
$msg = "[动态抽奖]-删除动态 抽奖已过期 {$did}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isset($card["item"]["orig_dy_id"])) {
|
||||||
|
$ret = Dynamic::getLotteryNotice($card["item"]["orig_dy_id"]);
|
||||||
|
if (isset($ret['data']['lottery_time']) && $ret['data']['lottery_time'] <= time()) {
|
||||||
|
$flag = true;
|
||||||
|
$msg = "[动态抽奖]-删除动态 抽奖已过期 {$did}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (isset($card['origin'])) {
|
||||||
|
// $origin = json_decode($card["origin"], true);
|
||||||
|
// if (isset($origin['item']['description'])) {
|
||||||
|
// if (isset($card["item"]['description'])) {
|
||||||
|
// $text = $origin["item"]["description"];
|
||||||
|
// } elseif (isset($card["item"]['content'])) {
|
||||||
|
// $text = $card["item"]["content"];
|
||||||
|
// } else {
|
||||||
|
// $text = null;
|
||||||
|
// }
|
||||||
|
// if ($text) {
|
||||||
|
// continue;
|
||||||
|
// // 关键字过滤
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
if ($flag) {
|
||||||
|
self::$del_dynamic[$did] = $msg;
|
||||||
|
if (isset($card['origin_user']['info']['uid'])) {
|
||||||
|
array_push(self::$un_follows, $card['origin_user']['info']['uid']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 取关
|
||||||
|
foreach (self::$del_dynamic as $did => $msg) {
|
||||||
|
Dynamic::removeDynamic($did);
|
||||||
|
Log::info($msg);
|
||||||
|
unset(self::$del_dynamic[$did]);
|
||||||
|
}
|
||||||
|
// 取关
|
||||||
|
foreach (self::$un_follows as $uid) {
|
||||||
|
Log::info("[动态抽奖]-未中奖-取关 {$uid}");
|
||||||
|
User::setUserFollow($uid, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function clearFollowGroup()
|
||||||
|
{
|
||||||
|
$tags = User::fetchTags();
|
||||||
|
foreach ($tags as $gid => $name) {
|
||||||
|
if (!in_array($name, ['玄不改非', '氪可改命'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$r = User::fetchTagFollowings($gid);
|
||||||
|
foreach ($r as $uid) {
|
||||||
|
Log::info("[清除抽奖组关注] : {$uid}");
|
||||||
|
User::setUserFollow($uid, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function clearAllDynamic()
|
||||||
|
{
|
||||||
|
$dynamicList = Dynamic::getMyDynamic();
|
||||||
|
foreach ($dynamicList as $dynamic) {
|
||||||
|
$did = $dynamic['desc']['dynamic_id'];
|
||||||
|
$card = json_decode($dynamic['card'], true);
|
||||||
|
if (strpos($card['item']['content'], self::$msg) !== false) {
|
||||||
|
Log::info("[删除所有动态] 删除动态 {$did}");
|
||||||
|
Dynamic::removeDynamic($did);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @use 添加分组
|
||||||
|
* @param int $need_follow_uid
|
||||||
|
* @param int $anchor_id
|
||||||
|
* @param int $time
|
||||||
|
*/
|
||||||
|
private static function addToGroup(int $need_follow_uid, int $anchor_id = 0, int $time = 0)
|
||||||
|
{
|
||||||
|
// 获取分组id
|
||||||
|
if (is_null(self::$group_id)) {
|
||||||
|
$tags = User::fetchTags();
|
||||||
|
$tag_id = array_search(self::$group_name, $tags);
|
||||||
|
// 如果不存在则调用创建
|
||||||
|
self::$group_id = $tag_id ? $tag_id : User::createRelationTag(self::$group_name);
|
||||||
|
}
|
||||||
|
// 是否在关注里
|
||||||
|
$default_follows = self::getDefaultFollows();
|
||||||
|
if (!in_array($need_follow_uid, $default_follows)) {
|
||||||
|
User::setUserFollow($need_follow_uid); // 关注
|
||||||
|
User::tagAddUsers($need_follow_uid, self::$group_id); // 转到分组中
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @use 获取默认关注
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private static function getDefaultFollows()
|
||||||
|
{
|
||||||
|
if (!empty(self::$default_follows)) {
|
||||||
|
return self::$default_follows;
|
||||||
|
}
|
||||||
|
// 如果获取默认关注错误 或者 为空则补全一个
|
||||||
|
self::$default_follows = User::fetchTagFollowings();
|
||||||
|
if (empty(self::$default_follows)) {
|
||||||
|
array_push(self::$default_follows, 1);
|
||||||
|
}
|
||||||
|
return self::$default_follows;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user