Wolfram mathematica 如何从Mathematica访问StackOverflow API

Wolfram mathematica 如何从Mathematica访问StackOverflow API,wolfram-mathematica,Wolfram Mathematica,前几天我想知道StackOverflow是否有一个API我可以从Mathematica访问,显然它有: 从StackOverflow获取数据到Mathematica的最佳方法是什么?Sjoerd利用这些信息绘制了一幅图。我感兴趣的是将SO相关通知添加到我保存在笔记本中的停靠单元格中,这样我就可以在不离开Mathematica的情况下判断何时有更新或响应。根据流行需求,使用(这是一个相当整洁和完整的API;有很多优点。也很简单-请参阅我的代码) 更新:添加以确保代码与SO-API(更高的每日呼叫上

前几天我想知道StackOverflow是否有一个API我可以从Mathematica访问,显然它有:


从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]