You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:04:14