Wolfram mathematica 如何从Mathematica访问StackOverflow API
前几天我想知道StackOverflow是否有一个API我可以从Mathematica访问,显然它有:Wolfram mathematica 如何从Mathematica访问StackOverflow API,wolfram-mathematica,Wolfram Mathematica,前几天我想知道StackOverflow是否有一个API我可以从Mathematica访问,显然它有: 从StackOverflow获取数据到Mathematica的最佳方法是什么?Sjoerd利用这些信息绘制了一幅图。我感兴趣的是将SO相关通知添加到我保存在笔记本中的停靠单元格中,这样我就可以在不离开Mathematica的情况下判断何时有更新或响应。根据流行需求,使用(这是一个相当整洁和完整的API;有很多优点。也很简单-请参阅我的代码) 更新:添加以确保代码与SO-API(更高的每日呼叫上
从StackOverflow获取数据到Mathematica的最佳方法是什么?Sjoerd利用这些信息绘制了一幅图。我感兴趣的是将SO相关通知添加到我保存在笔记本中的停靠单元格中,这样我就可以在不离开Mathematica的情况下判断何时有更新或响应。根据流行需求,使用(这是一个相当整洁和完整的API;有很多优点。也很简单-请参阅我的代码) 更新:添加以确保代码与SO-API(更高的每日呼叫上限)更好地协同工作。请仅在此应用程序中使用 2011年4月 2011年8月 MMA 8版本!MMA 7版本进一步向下
getRepChanges[userID_Integer] :=
Module[{totalChanges},
totalChanges =
"total" /.
Import["http://api.stackoverflow.com/1.1/users/" <>
ToString[userID] <> "/reputation?key=NgVJ4Y6vFkuF-oqI-eOvOw&fromdate=0&pagesize=1&page=1",
"JSON"
];
Join @@
Table[
"rep_changes" /.
Import["http://api.stackoverflow.com/1.1/users/" <>
ToString[userID] <>
"/reputation?key=NgVJ4Y6vFkuF-oqI-eOvOw&fromdate=0&pagesize=100&page="
<> ToString[page],
"JSON"
],
{page, 1, Ceiling[totalChanges/100]}
]
]
topAnswerers =
({"display_name","user_id", "email_hash"} /. #) & /@
("user" /.
("top_users" /.
Import[
"http://api.stackoverflow.com/1.1/tags/mathematica/top-answerers/all-time",
"JSON"
]
)
)
topAnswerers = {#, #2,
Import["http://www.gravatar.com/avatar/" <> #3 <> ".jpg?s=36&d=identicon&d=identicon"]
} & @@@ topAnswerers
repChangesTopUsers =
Table[
repChange =
ReleaseHold[
(
Hold[
{
DateList["on_date" + AbsoluteTime["January 1, 1970"]],
"positive_rep" - "negative_rep"
}
] /. #
) & /@ getRepChanges[userID]
] // Sort;
accRepChange = {repChange[[All, 1]],Accumulate[repChange[[All, 2]]]}\[Transpose],
{userID, topAnswerers[[All, 2]]}
];
pl = DateListLogPlot[
Tooltip @@@
Take[({repChangesTopUsers, Row /@ topAnswerers[[All, {3, 1}]]}\[Transpose]),
10], Joined -> True, Mesh -> None, ImageSize -> 1000,
PlotRange -> {All, {10, All}},
BaseStyle -> {FontFamily -> "Arial-Bold", FontSize -> 16},
DateTicksFormat -> {"MonthNameShort", " ", "Year"},
GridLines -> {True, None},
FrameLabel -> (Style[#, FontSize -> 18] & /@ {"Date", "Reputation",
"Top-10 answerers", ""})]
Brett,与SO API无关,但您可以使用RSS提要来处理最新的Mathematica标记问题。以下是我的简单实现:
QuestionHyperlink[data_] :=
Function[{name, title, link},
Hyperlink[Tooltip[title, name], link]] @@ Join[
Cases[data,
XMLElement[
"author", _, {___, XMLElement["name", {}, {name_}], ___}] :>
name],
Cases[data, XMLElement["title", _, {title_}] :> title],
Cases[data, XMLElement["link", rules_, {}] :> ("href" /. rules)]]
Cases[Import[
"http://stackoverflow.com/feeds/tag?tagnames=mathematica&sort=\
newest", "XML"],
XMLElement["entry", attrs_, data_] :>
QuestionHyperlink[data], Infinity]
我从这个问题和答案中学到了很多。以前从未使用Mma来连接Web。多亏了all@Mr.WizardJSON导入在Mathematica V8中是新的。这可能对V7用户有用(包括代码和至少一个其他实现的链接)谢谢。不要试图弄清楚我在哪个时区,这只会让你感到困惑。@sjoard应用你的课程::)@Mr.Wizard我添加了一些辅助功能。这似乎微不足道,但我遇到了几个困难。我无法测试所有的东西,因为我似乎又被API封顶了。添加内容与以前一样采用JSON格式。上述mma 7的基本JSON导入应该适用于您。@Mr.Wizard API现在再次启动并运行。这些函数可以找到726个标记为mathematica的问题和1707个答案。所以有2433个mathematica相关的帖子可以用来过滤声誉。这不是你想经常做的事情,因为它非常缓慢。要获得ID726的答案,需要单独调用API。这可能会触发IP上限,当你这样做太频繁。在我的电脑上花了7分钟。我建议对所有与Wolfram相关的问题使用以下RSS URL:@Sasha这正是我浪费时间做的事情。:)+1谢谢你自己的反馈。@Alexey考虑到mma问题在这里相对较少,而且有一大群回答者等着吞食任何扔到他们中间的东西,我希望有一个即时的解决方案,而不是基于投票。@Sjoerd你是什么意思?它和什么有关?@Alexey我的问题是,我的手机上有一个RSS阅读器,我像每隔一个晚上一样,用它阅读大约20个提要,但如果是这样的话,我需要在有东西到达时被ping一下,否则这个有趣的问题已经被彻底回答了。
tagLookup[postID_Integer] :=
Module[{im},
im = Import["http://api.stackoverflow.com/1.1/questions/" <> ToString[postID],"JSON"];
If[("questions" /. im) != {},
First[("tags" /. ("questions" /. im))],
im = Import["http://api.stackoverflow.com/1.1/answers/" <> ToString[postID],"JSON"];
First[("tags" /. ("questions" /. Import["http://api.stackoverflow.com/1.1/questions/" <>
ToString[First["question_id" /. ("answers" /. im)]], "JSON"]))]
]
]
getQuestionIDs[tagName_String] := Module[{total},
total =
"total" /.
Import["http://api.stackoverflow.com/1.1/questions?tagged=" <>
tagName <> "&pagesize=1", "JSON"];
Join @@
Table[("question_id" /. ("questions" /.
Import["http://api.stackoverflow.com/1.1/questions?key=NgVJ4Y6vFkuF-oqI-eOvOw&tagged=" <>
tagName <> "&pagesize=100&page=" <> ToString[i],
"JSON"])), {i, 1, Ceiling[total/100]}]
]
getAnswerIDsFromQuestionID[questionID_Integer] :=
Module[{total},
total =
Import["http://api.stackoverflow.com/1.1/questions/" <>
ToString[questionID] <> "/answers?key=NgVJ4Y6vFkuF-oqI-eOvOw&pagesize=1", "JSON"];
If[total === $Failed, Return[$Failed], total = "total" /. total];
Join @@ Table[
"answer_id" /. ("answers" /.
Import["http://api.stackoverflow.com/1.1/questions/" <>
ToString[questionID] <> "/answers?key=NgVJ4Y6vFkuF-oqI-eOvOw&pagesize=100&page=" <>
ToString[i], "JSON"]), {i, 1, Ceiling[total/100]}]
]
getAnswerIDsFromTag[tagName_String] :=
Module[{},
Join @@ (getAnswerIDsFromQuestionID /@
Cases[getQuestionIDs[tagName], Except[$Failed]])
]
QuestionHyperlink[data_] :=
Function[{name, title, link},
Hyperlink[Tooltip[title, name], link]] @@ Join[
Cases[data,
XMLElement[
"author", _, {___, XMLElement["name", {}, {name_}], ___}] :>
name],
Cases[data, XMLElement["title", _, {title_}] :> title],
Cases[data, XMLElement["link", rules_, {}] :> ("href" /. rules)]]
Cases[Import[
"http://stackoverflow.com/feeds/tag?tagnames=mathematica&sort=\
newest", "XML"],
XMLElement["entry", attrs_, data_] :>
QuestionHyperlink[data], Infinity]