如何将 t.co URL 反转回原始的推文?

21

我正在研究我们网站的分析数据,发现有一批 t.co 的 URL 是我们推广活动的来源。我尝试着找到一种方法,通过 Twitter API 或其他途径将这些 URL 还原回它们所来源的原始推文。然而我似乎无法找到一个好的方式来实现,是否有任何方法可以做到这一点呢?

7个回答

1
当 t.co 转发指向一条推文时,它会转到该推文的网页,并且网页的 HTML 将包含规范 URL。
获取此信息的丑陋方法是使用 wget 或 curl 获取 HTML 目标,其中将包括您最初的推文的 URL。
更好的方法是使用 Python 模块 Requests(您需要先安装此模块)。这是一个快速的命令行脚本,可以执行此操作:
#!/usr/bin/env python

import requests

shorturl = raw_input("Enter the shortened URL in its entirety: ")
r = requests.get(shorturl)

print("""
The shortened URL forwards to:

    %s
""" % r.url)

那段代码适用于任何URL缩短服务,而不仅仅是Twitter的t.co网站。
我使用Python 2.7进行测试,但很有可能上述代码也适用于Python 3.x。无论哪种方式,Requests都是您的好朋友,请参阅文档以获取详细信息:

http://docs.python-requests.org/en/latest/index.html

重定向和历史记录部分涵盖此示例。

我不知道通过Twitter API如何实现,如果所有URL缩短都是自动的,则可能无法实现。尽管如此,基于API的解决方案仅适用于t.co地址,而上面的代码将适用于任何其他缩短的URL或任何重定向到其他位置(例如HTTP 301或302响应代码)的URL。

编辑(比从未更好一点):在使用上述方法找到t.co转发实际指向的位置后,将有三种或四种可能的结果。 最常见的是它是OP认为他们所有人都是的缩短为贴在推文中的URL,公平地说,大多数情况确实如此。

其他可能性是它链接回推文本身,这通常仅出现在某些相当长的推文中(不确定随着字符限制增加而增加多少次);以及转发到与推特作者的状态URL无关的状态的URL,这通常是嵌入式媒体(图像和视频)的情况;以及转发到正在引用推文或转推的推文的URL。

鉴于原始情景,内部Twitter用法中的任何一种都不应该被看到,只有“正常”的转发才是关注的重点。现在,在twitter.com上搜索t.co地址将无济于事,无论使用什么组合。
然而,搜索目标地址,就像本答案开头的脚本所显示的那样,却是另一回事。这将产生每个公开可访问并发布了该链接的推文结果。然而,还存在一些缺点,包括:
1. 搜索结果将包括使用其他转发服务的推文。 2. 没有办法确定所有链接到该URL的推文是否生成了相同的t.co地址。 3. 如果没有,就无法看到哪个推文使用了哪个t.co转发。
尽管如此,在Web服务器上配合完整的引荐日志,可能可以进一步缩小范围。假设引荐URL报告了推文的URL,而不仅仅是twitter.com。然而,这更可能取决于点击链接的人所采用的方式(即他们只是在流中看到推文,还是展开它以显示其完整的URL)。
我怀疑引荐日志的有效性会不稳定,并且在使用应用程序不太可能以那种方式扩展推文以便将数据提供给第三方网站的智能手机和平板电脑上可能会降低。
#!/usr/bin/env python3

import requests
import urllib.parse

shorturl = input("Enter the shortened URL in its entirety: ")
r0 = requests.get(shorturl, verify=True)
t0 = "https://twitter.com/search?f=tweets&q="
t1 = urllib.parse.quote_plus(r0.url)
r1 = requests.get("{0}{1}".format(t0, t1), verify=True)

# the results will be in r1.content
# there may be some benefit from cutting the http:// or 
# https:// from r0.url before creating the quoted string in t1.

然而,如果不向Twitter支付增强数据访问的费用,那就只能到这种程度了。


附加说明:如果您需要在HTTPS网站上检查重定向,则将第6行更改为以下内容:r = requests.get(fwdurl,verify = False) - Ben
附录补充说明:最近版本的requests模块对verify=False会产生警告信息,但是自去年以来证书检查已经得到改进。因此,现在将第6行更改为r = requests.get(fwdurl, verify=True),这对HTTP和HTTPS都适用。此外,成为唯一的答案并获得赏金使某人的负评变得可笑。 - Ben
这将返回缩短链接转发到的URL,但OP正在寻求一种返回创建缩短链接的推文的URL的方法。 - Benjamin Carlsson
@Glacials,我终于解决了这个问题,而且是在没有花费大量资金购买他们的企业数据分析服务的情况下,通过逆向工程Twitter所能得到的最好结果。虽然不是百发百中,但如果有人能想出一种方法来解决这个问题,我会印象深刻的。 - Ben
为什么使用curl会被认为是“丑陋”的?它是一个非常广泛可用的工具,只需调用一个命令行选项即可。无需阅读Python代码,甚至无需安装Python。 - Dan Dascalescu
为什么使用curl被认为“丑陋”?它是一个非常常见的工具,只需要一个命令行选项就可以调用它。无需阅读Python代码,甚至无需安装Python。 - undefined

1
这是不可能通过 Twitter 提供的公共 API 实现的。
如果我理解正确,您想要找到一个最初嵌入了特定 t.co 链接的推文。即,当跟随该 t.co 链接时,会解析到您的网站,而不是 Twitter 推文。

1
如果您使用Twitter搜索API,可以找到提到t.co URL的推文(如果它们对您可见),并通过这种方式找到链接。
以下是一些Python代码,摘自我写的更长的博客文章
from requests_oauthlib import OAuth1Session


sess = OAuth1Session(
    client_key=TWITTER_CONSUMER_KEY,
    client_secret=TWITTER_CONSUMER_SECRET,
    resource_owner_key=TWITTER_ACCESS_TOKEN,
    resource_owner_secret=TWITTER_ACCESS_TOKEN_SECRET
)


def find_tweets_using_tco(tco_url):
    """
    Given a shortened t.co URL, return a set of URLs for tweets that use this URL.
    """
    # See https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets.html
    resp = sess.get(
        "https://api.twitter.com/1.1/search/tweets.json",
        params={
            "q": tco_url,
            "count": 100,
            "include_entities": True
        }
    )

    statuses = resp.json()["statuses"]

    tweet_urls = set()

    for status in statuses:
        # A retweet shows up as a new status in the Twitter API, but we're only
        # interested in the original tweet.  If this is a retweet, look through
        # to the original.
        try:
            tweet = status["retweeted_status"]
        except KeyError:
            tweet = status

        # If this tweet shows up in the search results for a reason other than
        # "it has this t.co URL as a short link", it's not interesting.
        if not any(u["url"] == tco_url for u in tweet["entities"]["urls"]):
            continue

        url = "https://twitter.com/%s/status/%s" % (
            tweet["user"]["screen_name"], tweet["id_str"]
        )

        tweet_urls.add(url)

    return tweet_urls

1
  1. 通过使用 http://www.getlinkinfo.com 这样的服务,找出缩短的URL指向的原始URL。
  2. 将该原始URL粘贴到Google的搜索框中。

如果你特别想从Twitter上查找引用,请这样做:site:twitter.com "https://example.com"


0
Twitter的t.co URL缩短服务只是在HTTP响应中重定向到另一个URL。要找到该URL,您只需要获取t.co URL并查看响应中的location头信息。可以使用curl实现此操作:
curl -v <t.co URL>

要从所有信息中提取URL,您可以使用以下代码:

curl -w "%{redirect_url}" <t.co URL>

-w选项告诉curl仅输出redirect_url变量。


-1
您可以在Google Analytics中的“社交网络”和“反向链接”菜单下直接查看提到您页面的推文列表。

-3

这是如何找到原始推文的方法:

  1. 点击t.co链接以查找原始URL
  2. 前往https://twitter.com/explore (#)
  3. 将链接复制并粘贴到“搜索Twitter”搜索框中
  4. 您将看到带有链接的推文

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接