از امروز قابلیتهای اجتماعی گوگل ریدر با گوگل پلاس یکی شده و به همین جهت یک سری از امکانات قدیمی آن حذف گردیدهاند؛ مانند به اشتراک گذاری و لایک زدن و غیره و تمام اینها با دکمهی به علاوه یک گوگل پلاس جایگزین شدهاند. اینبار میشود علاقمندیها را از گوگل ریدر به حلقههای گوگل پلاس هدایت کرد. همهی اینها خوب؛ اما سیستم به اشتراک گذاریهای روزانهی من رو به هم ریخته این کارها! قبلا از حاصل اشتراکها در گوگل ریدر، یک فید تهیه میشد که الان دیگر وجود خارجی ندارد. هیچکدام از حلقههای گوگل پلاس هم فید ندارند. به این ترتیب این محصول، تبدیل به یک فیدخوان معمولی شده است. مثل 100ها برنامهی مشابه دیگر.
اما ... در ادامه ببینیم که چطور میتوان از گوگل ریدر جدید، راهی به خارج باز کرد!
الف) زمانیکه در محیط گوگل ریدر، بر روی دکمه به علاوه یک گوگل پلاس قرار گرفته در ذیل یک مطلب کلیک میکنید، میتوان نام حلقهای از حلقههای گوگل پلاس را انتخاب کرد تا مطلب ما به آن ارسال شود. یکی از این حلقهها، Public نام دارد. بنابراین اینبار اگر قصد به اشتراک گذاری عمومی مطلبی را داشتید مطابق شکل زیر، حلقه Public را وارد نمائید و جالب اینجا است که این حلقه فقط در گوگل ریدر قابل انتخاب است؛ نه در خود گوگل پلاس.
ب) اکنون به اکانت گوگل پلاس خود مراجعه کنید. در قسمت پروفایل، به لینک بالای صفحه دقت نمائید. چیزی است شبیه به:
https://plus.google.com/u/0/userId/posts
این userId برای ادامه کار مهم است.
ج) از این userId برای فراخوانی لینک زیر استفاده خواهیم کرد (userId آن باید جایگزین شود):
https://plus.google.com/_/stream/getactivities/?&sp=[1,2,"userId",null,null,null,null,"social.google.com",[]]
خروجی آن طبق معمول متداول گوگل، فرمت JSON است و میتوان از آن لیست اشتراکهای عمومی را استخراج کرد. برای نمونه کلاس GooglePlusJsonParser تهیه شده زیر میتواند این عملیات را انجام دهد:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
//needs a ref. to System.Web.Extensions asm.
using System.Web.Script.Serialization;
namespace GooglePlus
{
[DebuggerDisplay("{DateTime}-{Title}-{Comment}-{Url}")]
public class GooglePlusItem
{
public DateTime DateTime { set; get; }
public string Url { set; get; }
public string Title { set; get; }
public string Comment { set; get; }
}
public static class Utils
{
public static DateTime ConvertFromUnixTimestamp(this long data)
{
return new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(data);
}
public static string ToSafeString(this object data)
{
return data == null ? string.Empty : data.ToString();
}
}
public class GooglePlusJsonParser
{
public static IList<GooglePlusItem> GetMyPublicItemsList(string userId)
{
var url = string.Format("https://plus.google.com/_/stream/getactivities/?&sp=[1,2,\"{0}\",null,null,null,null,\"social.google.com\",[]]", userId);
var jsonData = new WebClient().DownloadString(url);
return ParsePublicData(jsonData);
}
public static IList<GooglePlusItem> ParsePublicData(string jsonData)
{
jsonData = removeRedundantData(jsonData);
var posts = parseJson(jsonData);
return createItemsList(posts);
}
private static IList<GooglePlusItem> createItemsList(object[] posts)
{
var result = new List<GooglePlusItem>();
foreach (object[] post in posts)
{
var items = (object[])((object[])post[66])[0];
result.Add(new GooglePlusItem
{
DateTime = (((Int64)post[5]) / 1000).ConvertFromUnixTimestamp(),
Title = items[3].ToSafeString(),
Url = items[1].ToSafeString(),
Comment = post[4].ToSafeString()
});
}
return result;
}
private static object[] parseJson(string jsonData)
{
var jsonObject = new JavaScriptSerializer().Deserialize<object[]>(jsonData);
var posts = (object[])(((object[])jsonObject[1])[0]);
return posts;
}
private static string removeRedundantData(string jsonData)
{
return jsonData.Replace(")]}'", string.Empty)
.Replace("[,", "[\"\",")
.Replace(",,", ",\"\",")
.Replace(",,", ",\"\",");
}
}
}
نحوه استفاده از آن هم میتواند فراخوانی متد GooglePlusJsonParser.GetMyPublicItemsList به همراه userId یاده شده باشد.
ایده اصلی از:
Getting the Google+ Feed for any profile in JSON