必应图片下载
微软的必应搜索引擎拥有令人惊艳的背景图片。使用这段代码,您可以创建一个Windows服务或其他类型的应用程序,来自动化图片下载过程,然后将Windows桌面背景设置为使用指定的文件夹。
引言
微软的必应搜索引擎拥有令人惊艳的背景图片;但是,如果您想将它们用作Windows桌面的背景图片,您必须经历每天打开浏览器并保存图片的繁琐过程。
除非您可以自动化这个过程。
查找图片
这个过程的第一步是找到图片。由于它们是网页上的背景,因此必须将图片下载到您的临时互联网文件文件夹中;但是,这些文件有时具有难以理解的名称,在清理临时文件时可能会被删除,并且当然,您必须访问必应才能启动下载。
Long Zheng 在 www.istartedsomething.com 上创建了一个包含所有必应图片的优秀档案,但问题在于,虽然有一个RSS订阅源可用,但无法直接从该网站下载它们。这里有关于使用RSS订阅源创建主题文件的说明:http://www.makeuseof.com/tag/how-to-set-a-bing-wallpaper-desktop-slideshow-in-windows-7/;但是,我发现这种方法不可靠。
经过一些调查,我发现可以使用以下URL从必应获取图片信息:http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US。
正如 format 参数所示,这将返回一个XML格式的流,其中包含诸如图片日期、相对URL、描述和版权信息等信息。
idx 参数告诉您希望从哪里开始。0 将从当前日期开始,1 将从前一天开始,2 将从再前一天开始,依此类推。例如,如果日期是2011年1月30日,使用 idx = 0,文件将以 20110130 开头;使用 idx = 1,它将以 20110129 开头;等等。
n 参数告诉您要返回多少张图片。n = 1 将只返回一张,n = 2 将返回两张,依此类推。
mkt 参数告诉您必应提供的八个市场中,您希望从哪个市场获取图片。有效值是:en-US、zh-CN、ja-JP、en-AU、en-UK、de-DE、en-NZ、en-CA。
自动化下载
现在您知道从哪里获取图片了,就可以轻松创建一个自动化过程来下载它们。
public class BingImages
{
private const string DOWNLOAD_PATH = @"D:\BingImages";
private const string BING = "http://www.bing.com";
private const string IMG_URL = "http://www.bing.com/HPImageArchive" +
".aspx?format=xml&idx=0&n={0}&mkt={1}";
private static string[] Markets = new string[] { "en-US", "zh-CN",
"ja-JP", "en-AU", "en-UK",
"de-DE", "en-NZ", "en-CA" };
private const int NUMBER_OF_IMAGES = 1;
/// <summary>
/// Download images from Bing
/// </summary>
public static void DownLoadImages()
{
// Make sure destination folder exists
ValidateDownloadPath();
XDocument doc = null;
WebRequest request = null;
// Because each market can have different images
// cycle through each of them
foreach (string market in Markets)
{
// Form the URL based on market
// Since this will be run once per day only 1 image needs to
// be downloaded
string url = string.Format(IMG_URL, NUMBER_OF_IMAGES, market);
request = WebRequest.Create(url);
using (Stream stream = request.GetResponse().GetResponseStream())
{
// Load the stream into and XDocument for processing
doc = XDocument.Load(stream);
}
// Iterate through the image elements
foreach (XElement image in doc.Descendants("image"))
{
SaveImage(image.Element("url").Value);
}
}
}
/// <summary>
/// Save image from the give URL to disk
/// </summary>
/// <param name="url">URL of image to save</param>
private static void SaveImage(string url)
{
// Images can be duplicated between markets
// so to avoid duplicates from being downloaded
// get the unique name based on the image number in the URL
string filename = GetImageName(url);
if (!File.Exists(filename))
{
// URL is relative so form the absolute URL
WebRequest request = WebRequest.Create(BING + url);
using (Stream stream = request.GetResponse().GetResponseStream())
{
Image img = Image.FromStream(stream);
img.Save(filename);
}
}
}
/// <summary>
/// Create filename for image based on URL
/// </summary>
/// <param name="url">Image URL</param>
/// <returns>FQN for saving image to</returns>
private static string GetImageName(string url)
{
// URL is in this format /fd/hpk2/DiskoBay_EN-US1415620951.jpg
// Extract the image number
Regex reg = new Regex(@"[0-9]+\w");
Match m = reg.Match(url);
// Should now have 1415620951 from above example
// Create path to save image to
return string.Format(@"{0}\{1}.jpg", DOWNLOAD_PATH, m.Value);
}
/// <summary>
/// Check if download path exist and create if necessary
/// </summary>
private static void ValidateDownloadPath()
{
if (!Directory.Exists(DOWNLOAD_PATH))
{
Directory.CreateDirectory(DOWNLOAD_PATH);
}
}
}
使用这段代码,您可以创建一个Windows服务或其他类型的应用程序,来自动化下载过程,然后将Windows桌面背景设置为使用指定的文件夹。