基于PHP CLI脚本从默认与引用转发中识别目标@useraccount
嘿,针对你开发PHP CLI脚本时遇到的两种转发识别问题,我给你整理了一套精准的方案,分情况来看:
如何精准识别两类转发中的目标账号@useraccount
一、先理清两种转发的核心判断逻辑
咱们先把两种转发的本质差异抓准,再针对性写判断逻辑,避免误判:
1. 默认转发(标准RT)的识别
这种转发最靠谱的判断依据不是文本里的“RT @xxx”(毕竟有人会手动打这个字符串凑数),而是API返回的retweeted_status字段——只要这个字段存在,并且它指向的原推文作者是你的目标账号,那就是实打实的默认转发。
PHP代码示例:
$targetAccount = 'useraccount'; // 替换成你的目标账号 $isDefaultRetweet = false; // 遍历返回的推文列表 foreach ($result as $tweet) { // 检查是否存在retweeted_status,且原作者是目标账号 if (property_exists($tweet, 'retweeted_status') && strtolower($tweet->retweeted_status->user->screen_name) === strtolower($targetAccount)) { $isDefaultRetweet = true; echo "这条是默认转发目标账号的推文\n"; break; } }
这里转成小写是为了避免账号大小写的干扰(Twitter账号实际不区分大小写)。
2. 引用转发(Quote Tweet)的识别
引用转发没有retweeted_status字段,但通常会在推文内容里提及目标账号,或者包含原推文的链接。咱们优先用API解析好的entities字段判断,再用文本匹配兜底:
PHP代码示例:
$targetAccount = 'useraccount'; $isQuoteRetweet = false; foreach ($result as $tweet) { // 先跳过默认转发的情况,避免重复判断 if (property_exists($tweet, 'retweeted_status')) continue; // 方法1:用API解析的user_mentions判断(最可靠) if (isset($tweet->entities->user_mentions)) { foreach ($tweet->entities->user_mentions as $mention) { if (strtolower($mention->screen_name) === strtolower($targetAccount)) { $isQuoteRetweet = true; echo "这条是引用转发目标账号的推文\n"; break 2; // 直接跳出两层循环 } } } // 方法2:正则精准匹配文本里的@账号(兜底用,防止API解析遗漏) // \b是单词边界,避免匹配到@useraccount1这类相似账号 $pattern = '/@' . preg_quote($targetAccount, '/') . '\b/i'; if (preg_match($pattern, $tweet->text)) { $isQuoteRetweet = true; echo "这条是引用转发目标账号的推文\n"; break; } }
二、整合两种情况的通用判断函数
把上面的逻辑整合成一个可复用的函数,方便你在脚本里调用:
function hasRetweetedTarget($tweets, $targetAccount) { $lowerTarget = strtolower($targetAccount); foreach ($tweets as $tweet) { // 检查默认转发 if (property_exists($tweet, 'retweeted_status')) { $originalAuthor = strtolower($tweet->retweeted_status->user->screen_name); if ($originalAuthor === $lowerTarget) { return true; } continue; // 默认转发不用再检查引用情况 } // 检查引用转发的提及 if (isset($tweet->entities->user_mentions)) { foreach ($tweet->entities->user_mentions as $mention) { if (strtolower($mention->screen_name) === $lowerTarget) { return true; } } } // 兜底的文本匹配 $pattern = '/@' . preg_quote($targetAccount, '/') . '\b/i'; if (preg_match($pattern, $tweet->text)) { return true; } } return false; } // 调用示例 $target = 'useraccount'; $hasRetweeted = hasRetweetedTarget($result, $target); if ($hasRetweeted) { echo "该用户转发过目标账号的推文!"; } else { echo "该用户没有转发过目标账号的推文。"; }
额外小提醒
- 不要只靠文本里的“RT @xxx”判断默认转发,手动输入的不算有效转发,
retweeted_status才是官方认可的标识。 - 用
entities里的user_mentions比自己写正则更靠谱,因为API已经帮你解析好了所有提及的账号,避免正则漏判或误判。
内容的提问来源于stack exchange,提问作者Mike Purcell
相关产品推荐
相关产品推荐

