获取Kindle图书馆图书清单

时间:2011-08-25 13:42:14

标签: api amazon kindle

有没有人知道如何以编程方式从用户的亚马逊Kindle库中获取图书清单?我想建立一个借书的服务。理想情况下,用户可以导出他们愿意借出的书籍清单,而无需单独输入每一本书。我相信亚马逊可能会有这种API,但一直无法找到任何文档。我或多或少与语言无关。如果有任何建议,请提前致谢。

7 个答案:

答案 0 :(得分:9)

解决方案:用户可以选择将他们的kindle作为可移动驱动器安装,并进一步将所有电子书文件拖放到页面上。然后我解析包含ASIN的所有文件名。使用ASIN,我可以搜索亚马逊的书籍信息,包括它是否可以借出。

这并不是我所希望的,但它的效果还不错。如果有人想出一个更有说服力的解决方案,我会非常感兴趣!

答案 1 :(得分:5)

我已经创建了一个javascript函数的Gist,它将使用https://read.amazon.com导出所有书籍的完整列表。亚马逊Kindle阅读器Web应用程序使用Web SQL在本地存储您的书籍的完整列表(无需“下载”它们),并且要点基本上将书籍列表导出到CSV文件。我在Gist中评论了一些注释,因此您可以根据自己的需要进行自定义:

https://gist.github.com/jkubecki/d61d3e953ed5c8379075b5ddd8a95f22

这与@ user2493694提议做的类似,但是使用底层数据而不是解析页面。

答案 2 :(得分:4)

答案 3 :(得分:4)

几个星期前我在为Kindle寻找API时看过这篇文章。我意识到我正在挖掘一个相当古老的帖子,但在看到the answer from user2493694之后,我发现我可以像她描述的那样做饭。

该项目仍在开发中,但截至目前,该项目是Python中的功能性Kindle API。它主要关注用户当前的阅读位置(这是我最初对Kindle API感兴趣的主题),但它有可能提取所有公开的Kindle数据。

我已将其上传到https://github.com/msuozzo/Lector,非常感谢任何反馈或功能请求。

答案 4 :(得分:3)

我不知道他们是怎么做到的 - 但如果用他们的亚马逊帐户登录,Shelfari会根据购买历史记录导入用户的Kindle书籍(我想我已经看到某处亚马逊部分拥有Shelfari或者他们是某种方式附属)。无论如何,Shelfari界面 - 基本上是一个供读者使用的社交网络,还可以使用您的虚拟书架创建CSV。该文件基本上是一个简单的电子表格,其中包含书籍的识别数据。我之前使用过这个过程来转移我的Kindle库目录,因为它太麻烦了,无法逐一进行。 CSV文件通常可由其他网站导入或由Excel读取,以便您可以将数据复制并粘贴到更大的组中。

答案 5 :(得分:2)

我一直在考虑解析Kindle Cloud Reader的内容页面(https://read.amazon.com),以获取我的kindle库中的书籍列表。

答案 6 :(得分:0)

FireFox具有内置的Inspector工具,可按照user2493694的建议从Amazon云阅读器的“库”页面中翻录完整的书单:

  • 转到https://read.amazon.com/并显示“库”页面
  • 在“工具”>“ Web开发者”(Ctrl + Shift + C)下调用Inspector工具
  • 选择实际的列表部分(div #titles_inner_wrapper),它是所有书籍条目的直接上级
  • 在Inspector仪表板的HTML窗格中,复制所选零件的HTML

通过激活元素选择器(Ctrl + Shift + C或Inspector仪表板中最左侧的图标),将鼠标悬停在左上方的书本图标上,然后将其缓慢向上或向左移动,最容易完成选择列表部分的操作直到选择范围扩展到列表的整个内部为止(此时选择标题将显示div #titles_inner_wrapper)。此时,单击鼠标左键可在Inspector仪表板的HTML窗格中选择相应的节点,以便Ctrl + C将HTML复制到剪贴板。与该节点的右键菜单中的“复制”>“外部HTML”相同。

这会以HTML片段的形式提供完整的书籍清单,并带有易于解析的结构,包括ASIN:

<div id="titles_inner_wrapper" style="font-size: 191.25px;">
    <div id="B00DJI3HWS" class="book_container">
        <div class="book_cover">
            <img class="book_image book_click_area" src="https://images-na.ssl-images-amazon.com/images/P/B00DJI3HWS.01._SX255_SY255_TTXW_SCLZZZZZZZ_.jpg" title="I Bastardi di Pizzofalcone (Italian Edition)">
            <div class="alt_title book_click_area"></div>
        </div>
        <div class="book_details">
            <div class="book_title book_click_area">I Bastardi di Pizzofalcone (Italian Edition)</div>
            <div class="book_author book_click_area">Maurizio de Giovanni</div>
        </div>
    </div>
    ...
</div>

此手动过程仅需少量鼠标单击和击键。

以编程方式下载列表比发布HTTP GET和解析结果要复杂得多,因为云读取器需要身份验证并使用大量JavaScript。以下是一些概念验证代码,可使用.NET WebBrowser控件下载并保存列表。可以将代码编译为.cs文件,但也可以将其粘贴到LINQPad中并按原样运行(请参阅#ifdefs)。它在表单上使用可见的浏览器控件,因为可能需要登录到云阅读器。

在运行此脚本之前,您应该查看/修改文件名模板。

class KindleBookListProgram
{
    const string FILENAME_TEMPLATE = "x:\\kindle_library_{0:yyyyMMdd}.lst";  // gets DateTime.Now as parameter
    const string READ_AMAZON_COM = "https://read.amazon.com/";
    const string USERAGENT = "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko";
    const int URLMON_OPTION_USERAGENT = 0x10000001;

    static void Main ()
    {
        // setting the user agent in the Navigate() call works only once;
        // this works for the whole session
        UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, USERAGENT, USERAGENT.Length, 0);
    
        using (var form = new BrowserForm())
        {
            form.ShowDialog();
        }
    }

    [DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
    private static extern int UrlMkSetSessionOption (
        int dwOption, string pBuffer, int dwBufferLength, int dwReserved );
    
    class BrowserForm: Form
    {
        WebBrowser m_browser;
    
        public BrowserForm ()
        {   
            Width = 800;
            Height = 600;
    
            m_browser = new WebBrowser();
            m_browser.DocumentCompleted += handle_browser_DocumentCompleted;
            m_browser.Dock = DockStyle.Fill;
            Controls.Add(m_browser);
    
            KeyPreview = true;
            KeyDown += handle_KeyDown;
    
            m_browser.Navigate(READ_AMAZON_COM);
        }

        void find_and_save_book_list_frame (WebBrowser browser)
        {
            foreach (HtmlWindow frame in browser.Document.Window.Frames)
            {
                var elt = frame.Document.GetElementById("titles_inner_wrapper");
            
                if (elt != null)
                {
                    var text = elt.InnerHtml;

                    if (string.IsNullOrEmpty(text))
                    {
                        this.Text = "Book list is empty!";
#if LINQPAD
                        Console.WriteLine("{0} book list empty!\n", DateTime.Now);
#endif
                    }
                    else
                    {
                        var filename = string.Format(FILENAME_TEMPLATE, DateTime.Now);
#if LINQPAD
                        Console.WriteLine("##### {0} ######\n\n{1}\n\n", filename, text);
#endif
                        File.WriteAllText(filename, text, Encoding.UTF8);

                        this.Text = filename + " saved!";
                    }
                }
            }
        }

        void handle_browser_DocumentCompleted (object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            find_and_save_book_list_frame(sender as WebBrowser);
        }

        void handle_KeyDown (object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyValue == 17)  // ^S
            {
                e.SuppressKeyPress = true;
                find_and_save_book_list_frame(m_browser);
            }   
        }
    }
}

这个小脚本加载了云阅读器,并在DocumentCompleted事件触发时(即,当浏览器认为完成加载时)找到了图书清单。可以通过^S热键(也称为Ctrl + S)手动调用列表保存代码,以防DocumentCompleted事件在JavaScript实际加载图书列表之前触发。

注意:基于事件的自动保存可能会导致列表不完整,因此最好是在尘埃落定后始终手动保存。或者在DocumentCompleted事件中设置一个慷慨的计时器,以便仅在尘埃落定后才尝试自动保存,并且仅在结果证明稳定了几秒钟后才进行实际保存。我已经在a version of the code that does this上贴了PasteBin。