感觉换壁纸是一件麻烦的事情,正好最近又在学习c#,就随便做了一个东西,新手有多多的不足望见谅。(改进中)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.IO; using System.Runtime.InteropServices; namespace GetWebHtml { class Program { [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")] public static extern int SystemParametersInfo( int uAction, int uParam, string lpvParam, int fuWinIni ); public static readonly string _path = "d:\\ouput.html"; public static int _width = 1920, _height = 1080; static string GetKeyWord() { if (!File.Exists("KeyWord")) File.Create("KeyWord").Close(); StreamReader sr = new StreamReader("KeyWord"); string str = ""; string data = ""; while ((str = sr.ReadLine()) != null) { data += str + "\n"; } if (data == "") { Console.WriteLine("没有关键词"); Environment.Exit(0); } var datas = data.Split(‘\n‘); sr.Close(); return datas[new Random().Next(0, datas.Length - 1)]; } static string[] GetPicURl(string strs) { var datas = strs.Split(new string[] { "\"objURL\":" }, System.StringSplitOptions.RemoveEmptyEntries); int start = 0, end = 0; for (int i = 1; i < datas.Length; i++) { start = datas[i].IndexOf("\"") + "\"".Length; end = datas[i].IndexOf("\","); datas[i] = datas[i].Substring(start, end - start); } return datas; } static void Main(string[] args) { if (!File.Exists("IMGResolution")) File.Create("IMGResolution").Close(); StreamReader sr = new StreamReader("IMGResolution"); string msg = sr.ReadLine(); if (msg.Split(‘,‘).Length == 2) { _width = Int32.Parse(msg.Split(‘,‘)[0]); _height = Int32.Parse(msg.Split(‘,‘)[1]); } sr.Close(); try { WebClient MyWebClient = new WebClient(); MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据 Byte[] pageData = MyWebClient.DownloadData("http://image.baidu.com/search/index?ct=&z=&tn=baiduimage&ipn=r&word=" + GetKeyWord() + "&pn=0&ie=utf-8&oe=utf-8&cl=&lm=-1&fr=&se=&sme=&width=" + _width + "&height=" + _height); //从指定网站下载数据 // string pageHtml = Encoding.Default.GetString(pageData); //如果获取网站页面采用的是GB2312,则使用这句 string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句 //Console.WriteLine(pageHtml);//在控制台输入获取的内容 /* if (!File.Exists(_path)) File.Create(_path); using (StreamWriter sw = new StreamWriter(_path, false))//将获取的内容写入文本 { sw.Write(pageHtml); sw.Close(); } */ if (!Directory.Exists("C:\\Users\\xiaoke\\Pictures\\ダウンロード ピクチャ\\")) Directory.CreateDirectory("C:\\Users\\xiaoke\\Pictures\\ダウンロード ピクチャ\\"); while (true) { var strs = GetPicURl(pageHtml); Random ram = new Random(); string URL = strs[ram.Next(1, strs.Length)]; string fileName = "C:\\Users\\xiaoke\\Pictures\\ダウンロード ピクチャ\\" + URL.Substring(URL.LastIndexOf("/")); try { if (!File.Exists(fileName)) { File.Create(fileName).Close(); MyWebClient.DownloadFile(URL, fileName); SystemParametersInfo(20, 0, fileName, 0x1); } } catch (SystemException s) { continue; } break; } } catch (WebException webEx) { Console.WriteLine(webEx.Message.ToString()); } } } }
有几点要注意的东西,我以前写代码也遇到过,但是没有做过笔记,所以就忘记了,又要自己重新试一次,所以做笔记好重要啊。
start = datas[i].IndexOf("\"") + "\"".Length; end = datas[i].IndexOf("\","); datas[i] = datas[i].Substring(start, end - start); 一般Substring()的函数都是传递开始位置和从开始到结束的数量。这里所值得注意的是start是用IndexOf()方法获取的,所以start的位置是在第一个关键字符串的位置,那么如果我们想要从这个字符串之后一位开始的时候就要把位置调整至字符串最后一个字符,所以我加了字符串的长度。知道开始和结束了,那么开始位置和从开始到结束的数量作差就好。
下载百度图片html发现搜索图片存放在"objURL":标记后面的地址里,所以这里将所有信息都以"objURL":字符串来拆分。
经过我的观察发现百度网址的规律如下: http://image.baidu.com/search/index?ct=&z=&tn=baiduimage&ipn=r&word=" + 查询关键字 + "&pn=0&ie=utf-8&oe=utf-8&cl=&lm=-1&fr=&se=&sme=&width=" + 宽像素 + "&height=" + 高像素 所以根据关键字来查询想要的结果。 还有一个要注意的是File.Create()创建文件后会返回一个流,如果不关闭这个流,文件将一直被占用。 别在意日文,我的电脑就是日文系统的,为了不让风格突转,我依旧用了日文命名。 根目录获KeyWord文件中取关键字,换行符隔开,随机选取一个。分辨率在根目录IMGResolution中设置,不自动获取,因为很多电脑的分辨率是很难匹配的。
时间: 2024-10-09 14:49:07