如何使用 google reader API 标记已读项目?

2023-11-21

我一直在为谷歌阅读器开发一个客户端。一切工作正常,除了我无法编辑条目以添加“加星标”和“已读”等标签。 code.google.com/p/pyrfeed/wiki/GoogleReaderAPI 和 www.niallkennedy.com/blog/2005/12/google-reader-api.html 上的说明似乎已过时。更奇怪的是,我一直在检查谷歌本身使用的 POST 数据并尝试准确复制它,但我仍然无法让它工作。例如,我最接近的是http://www.google.com/reader/api/0/edit-tag带有 POST 数据 a=/user/-/state/com.google/starred&async=true&s=[feed]&i=[item]&T=[token]

这似乎正是谷歌本身所做的,但我总是得到“无效的流名称”。有什么建议吗?


我没有给你一个明确的答案,但我在 API api/0/edit-tag 方面也遇到了一些麻烦,并设法让它们正常工作。

我已经在使用 API 的其他部分,没有任何问题(api/0/stream/items/ids、api/0/unread-count),但是这个部分工作起来并不那么容易。

一段时间后,我重新开始检查他们的网络前端(使用 Chrome 开发工具)发送到 Google Reader 的请求,并制作了一个硬编码示例(您可以使用此代码,只需更改您自己的 id 和流) - 请注意它们具有所有必需的前缀:feed/(用于流)和 tag:google.com,2005:reader/item/(用于 id)。

        String authToken = getGoogleAuthKey();
        // I use Jsoup for the requests, but you can use anything you
        // like - for jsoup you usually just need to include a jar
        // into your java project
    Document doc = Jsoup.connect("http://www.google.com/reader/api/0/edit-tag")
        .header("Authorization", _AUTHPARAMS + authToken)
        .data(
                    // you don't need the userid, the '-' will suffice
                "a", "user/-/state/com.google/read",
                "async", "true",
                "s", "feed/http://www.gizmodo.com/index.xml",
                "i", "tag:google.com,2005:reader/item/1a68fb395bcb6947",
                "T", "//wF1kyvFPIe6JiyITNnMWdA"
        )
        // I also send my API key, but I don't think this is mandatory
        .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com")
        .timeout(10000)
        // don't forget the post! (using get() will not work)
        .**post()**;

下面是我将流中的特定项目标记为已读的最终代码(translateToItemAtomId 方法用于将 api/0/stream/items/ids 返回的长整数 id 转换为该 API 接受的原子 xml id):

        String authToken = getGoogleAuthKey();
    Document doc = Jsoup.connect("http://www.google.com/reader/api/0/edit-tag")
        .header("Authorization", _AUTHPARAMS + authToken)
        .data(
                "a", "user/-/state/com.google/read",
                "async", "true",
                "s", stream,
                "i", translateToItemAtomId(itemId),
                "T", getGoogleToken(authToken)
        )
        .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com")
        .timeout(10000).post();

您可能需要一些额外的代码(基于http://www.chrisdadswell.co.uk/android-coding-example-authenticating-clientlogin-google-reader-api/):

    private static final String _AUTHPARAMS = "GoogleLogin auth=";
private static final String _GOOGLE_LOGIN_URL = "https://www.google.com/accounts/ClientLogin";
private static final String _READER_BASE_URL = "http://www.google.com/reader/";
private static final String _API_URL = _READER_BASE_URL + "api/0/";
private static final String _TOKEN_URL = _API_URL + "token";
private static final String _USER_INFO_URL = _API_URL + "user-info";
private static final String _USER_LABEL = "user/-/label/";
private static final String _TAG_LIST_URL = _API_URL + "tag/list";
private static final String _EDIT_TAG_URL = _API_URL + "tag/edit";
private static final String _RENAME_TAG_URL = _API_URL + "rename-tag";
private static final String _DISABLE_TAG_URL = _API_URL + "disable-tag";
private static final String _SUBSCRIPTION_URL = _API_URL
        + "subscription/edit";
private static final String _SUBSCRIPTION_LIST_URL = _API_URL
        + "subscription/list";

public static String getGoogleAuthKey() throws IOException {
    String _USERNAME = "[email protected]";
    String _PASSWORD = "USER_PASSWORD";

    Document doc = Jsoup
            .connect(_GOOGLE_LOGIN_URL)
            .data("accountType", "GOOGLE", "Email", _USERNAME, "Passwd",
                    _PASSWORD, "service", "reader", "source",
                    "[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com")
            .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com")
            .timeout(4000).post();

    // RETRIEVES THE RESPONSE TEXT inc SID and AUTH. We only want the AUTH
    // key.
    String _AUTHKEY = doc
            .body()
            .text()
            .substring(doc.body().text().indexOf("Auth="),
                    doc.body().text().length());
    _AUTHKEY = _AUTHKEY.replace("Auth=", "");
    return _AUTHKEY;
}

// generates a token for edition, needed for edit-tag
public static String getGoogleToken(String authToken) throws IOException {
    Document doc = Jsoup.connect(_TOKEN_URL)
            .header("Authorization", _AUTHPARAMS + getGoogleAuthKey())
            .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com")
            .timeout(10000).get();

    // RETRIEVES THE RESPONSE TOKEN
    String _TOKEN = doc.body().text();
    return _TOKEN;
}

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 google reader API 标记已读项目? 的相关文章

  • onCompleted 可以与 useMutation 一起使用吗?

    我在 React 项目中使用 useMutation 钩子 突变运行成功 但之后未达到 onCompleted 我已在突变中将notifyOnNetworkStatusChange 设置为true 但这似乎没有帮助 const create
  • OnClickListener - 事件的 x,y 位置?

    我有一个从 View 派生的自定义视图 我希望在单击视图时收到通知 以及单击发生的 x y 位置 长按也是如此 看起来像这样做 我需要覆盖onTouchEvent 有没有办法从事件的 x y 位置OnClickListener相反 但是 如
  • map_partitions的返回值是多少?

    dask API 表示 map partition 可用于 在每个 DataFrame 分区上应用 Python 函数 根据此描述并根据 map 的通常行为 我期望 map partitions 的返回值是 类似于 一个长度等于分区数量的列
  • 找出最新术语和第二个最新术语之间的差异

    表的结构就像 create table events event type integer not null value integer not null time timestamp not null unique event type
  • Flutter 无法从剪贴板读取

    我来询问一个关于 Flutter 和 Future 的非常具体的问题 并等待机制 这似乎有效 但我的剪贴板在使用可编辑文本字段操作时并没有真正起作用 即使遵循 Google 关于实现的建议 这是我的粘贴代码 onPressed async
  • 如何在 IE(9+) 和 Safari (Pad) 中播放带有 HTML5 音频的 .m4a?

    我需要在 IE 9 和 Safari iPad iPhone 中播放 m4a 文件 在 iPhone 上录制 我在设置正确的 MIME 类型时遇到问题 为了在 IE10 中播放 我需要设置audio mp4但对于 Safariaudio a
  • 什么是正则表达式平衡组?

    我刚刚读到一个关于如何在双花括号内获取数据的问题 这个问题 然后有人提出了平衡组 我仍然不太确定它们是什么以及如何使用它们 我通读了平衡组定义 但解释很难理解 而且我对我提到的问题仍然很困惑 有人可以简单解释一下平衡组是什么以及它们有什么用
  • 在 Linux 上提取 TCP 往返时间 (RTT) 估计

    我有在 Ubuntu 上运行的 apache 服务器 客户端连接并下载图像 我需要提取底层 TCP 连接的 RTT 估计 有没有办法做到这一点 也许像在调试模式下运行我的 tcp 堆栈以让它在某处记录此信息之类的东西 请注意 我不想运行 t
  • 比较对象数组,与顺序无关

    我有 2 个对象数组 我必须比较它们 但是对象的顺序DOES NOT事情 我无法对它们进行排序 因为我没有它们的键名称 因为这些函数必须是通用的 我将获得的有关该数组的唯一信息是两个数组的对象具有相同数量的键 并且这些键具有相同的名称 因此
  • 即使模型值为空,TextBoxFor Helper 也会保留以前的值

    我有一个用于添加简单实体的 MVC 表单 我正在使用 TextBoxFor model gt model FieldName 创建输入字段 我有一个 保存 按钮和一个 保存并新建 按钮 保存和新建 按钮应该回发到 保存 操作 然后返回带有空
  • 如何获取通用扩展方法的MethodInfo?

    我有一个IEnumerable
  • 使用 PropertyInfo 找出属性类型

    我想动态解析对象树以进行一些自定义验证 验证本身并不重要 但我想更好地理解 PropertyInfo 类 我会做这样的事情 public bool ValidateData object data foreach PropertyInfo
  • MAC地址打印

    这是获取一些有关网络信息的代码 问题是当它打印 MAC 地址时 它会正常打印 有时与fff的 喜欢 00 21 84 a2 12 88 和 00 ffffff21 84 a2 12 ffffff88 因机器而异 这是代码 include
  • HttpWebRequest.EndGetResponse 在 Windows Phone 7 中引发 NotSupportedException

    在 Silverlight Windows Phone 7 项目中 我正在创建一个 HttpWebRequest 获取 RequestStream 向流中写入一些内容并尝试获取响应 但我总是收到 NotSupportedException
  • CGPathAddCurveToPoint 的参数是什么意思?

    我想建立一个CGPathRef以编程方式基于一天中不同时间点的太阳坐标 计算点数不是问题 但我想做一个CGPathRef那是顺利而有思想的CGPathAddCurveToPoint会是合适的 我了解路径 变换 x 和 y 参数 但我不确定其

随机推荐

  • python中按键减少

    我正在尝试思考在 python 中执行此操作的最有效方法 假设我有一个元组列表 dog 12 2 cat 15 1 dog 11 1 cat 15 2 dog 10 3 cat 16 3 假设我有一个函数 它接受其中两个元组并将它们组合起来
  • 为什么 DateTime.ToShortTimeString() 不尊重“区域和语言设置”中的短时间格式?

    我遇到了一个问题 可能是由于我对 DateTime ToShortTimeString 方法的工作原理的误解 当使用此函数格式化时间字符串时 我假设它会遵循 Windows 7 格式设置中的 短时间 设置 Control Panel gt
  • 在 Python 中以二进制格式写入和读取日期时间

    我想在 Python 中将日期时间列表存储在二进制文件中 编辑 二进制 是指每种数据类型的最佳数字表示 其用途是保存由 unix timestamp 纬度 经度 海拔 组成的GPS轨迹点 因此整个结构是little endian Long
  • 函数调用与局部变量

    我经常看到多次调用其他函数的函数 而不是存储一次函数的结果 i e 1 void ExampleFunction if TestFunction gt x TestFunction lt y TestFunction z a TestFun
  • 使用 R Shiny 框架的密码字段

    我打算为我的应用程序登录 为此我需要一个密码字段 我不知道闪亮是否用于此目的 但仍然可能吗 code for a simple text box is textInput id label value 但是有可能有密码字段吗 另外 与此同时
  • WPF 样式按钮 MouseOver 问题

    我正在尝试在按钮上制作一个简单的鼠标悬停效果 当鼠标悬停时它确实会改变颜色 但颜色会立即更改为默认按钮背景 我如何覆盖此行为 这是我的代码 Style myBtnStyle new Style Trigger bla new Trigger
  • Azure 导出 SQL 数据库示例

    鉴于 Microsoft 不推荐使用以前的导出 SQL DB 的方法 他们提出了一个建议的示例here subscriptionId YOUR AZURE SUBSCRIPTION ID Login AzureRmAccount Set A
  • 如何对 CursorLoader 结果进行排序?

    我使用 CursorLoader 查询结果 这不是我想要在 ListFramgenet 中显示的顺序 怎么排序呢 我用它来设置适配器 mAdapter new SimpleCursorAdapter getActivity android
  • 动态添加按钮到对话框

    有没有办法动态添加按钮到 jquery ui 中的对话框 我尝试使用 this add button 有时您也想稍后添加按钮 var mydialog result of jqueryui dialog var buttons mydial
  • 图像边框半径在 css 转换期间不起作用

    我在用着border radius 50 使图像变圆 默认情况下 图像会被模糊和缩放 带有隐藏的溢出 悬停时它将消除模糊和缩放 但是 当我在元素上使用 CSS 过渡时 它会在过渡期间暂时显示溢出 http jsfiddle net jonn
  • WatchOS 2:“无法安装手表应用程序”“启动‘TestApp WatchKit 应用程序扩展’时出错”

    每次我尝试在 Xcode 7 beta 4 中安装 watchOS 2 应用程序时 我都会在 iOS 上收到 AlertView 弹出错误 无法安装手表应用 TestApp 已安装在您的 iPhone 上 但 Apple Watch 的 T
  • 如何将 php 放入 JavaScript 中?

    我已经尝试过 但它不起作用 这里是tutorial我为此目的使用过 尝试这个
  • 使用 php 创建 api

    我想使用php开发一个简单的api 我的功能是 如果有人输入一些所需的值 那么他们将从我网站旁边的算法中获得计算结果 我不知道从哪里开始 并且也没有获得任何使用 PHP 的 API 示例代码 听起来您想创建一个其他人可以连接 发送答案和检索
  • 用于触摸手势的优秀 JavaScript 库或 jQuery 插件是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我不需要像 Sencha
  • 让 ng-repeat 在 AngularJS 的 $interpolate 服务中工作

    我正在使用 Bootstrap 的 AngularJs UI 组件 我想将填写好的模板插入到弹出窗口功能的数据元素之一中 这适用于查找不在 ng repeat 内部的所有元素 如何让 ng repeat 元素在插值模板中工作 我有一个笨蛋h
  • 使用 pdfbox 编辑 pdf 页面

    我如何通过在我已经知道的像素特定位置书写来使用java和pdfbox编辑pdf页面 我尝试过这个 但它会覆盖 PDDocument document null try document PDDocument load new File x
  • 使用什么原语来实现同步关键字?

    当我们使用synchronizedjava中的关键字 究竟使用哪个同步原语 Lock Semaphore Monitor Mutex EDIT JVM如何在本机级别实现锁 在字节码级别 java有monitorenter and monit
  • File.WriteAllText 不保留换行符

    这段代码的输出 string fileDateTime StepsGA DateTime Now ToString dd MM yyyy HH mm ss txt string fname System IO Path Combine Sy
  • 从 URL 获取 blob 并写入文件

    我试图fetch来自服务器的一些二进制数据 MP3 然后将其存储在文件中 var fs require fs var fetch require node fetch fetch audioUrl method GET headers Ac
  • 如何使用 google reader API 标记已读项目?

    我一直在为谷歌阅读器开发一个客户端 一切工作正常 除了我无法编辑条目以添加 加星标 和 已读 等标签 code google com p pyrfeed wiki GoogleReaderAPI 和 www niallkennedy com