2016年7月28日星期四

本地化Twitter图片

Twitter存档使Twitter重度用户备份资料成了可能,可是使用过存档的人会发现,所有图片还是留在服务器上的,无法放到本地保存。
虽然Twitter还是让人放心的,可是对于一些联网不正常的环境来说,本地化还是非常重要的。
Twitter为了节省宽带的需要,不会为你这样做的。
所以我来做这件事啊。其实很简单,就是把下载下来的文件里的图片地址全部下载到本地,再修改本地文件的URL。
因为使用了LinQ,所以使用了.NET 4.0,我想一般电脑支持吧。
执行文件TwitterPicLocal.exe要放在存档文件的\data\js\tweets位置。
因为生成类型选择了执行程序所以执行后不会看到窗口,但是如果你要使用的话可以放心使用,我不会私自做对你电脑有害的操作,实在不放心请重新生成后使用。


直接放代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Linq;
using System.Collections;

namespace TwitterPicLocal
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                DirectoryInfo TheFolder = new DirectoryInfo(".");
                foreach (FileInfo file in TheFolder.GetFiles())
                {
                    if (file.Extension == ".js")
                    {
                        Write(file.Name);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error:"+e.Message);
            }
            Console.ReadKey();
         
        }
        public static string DownLoadPics(string picUrl,string path) {
            Directory.CreateDirectory(path.Split('.')[0]);
            string filepath = path.Split('.')[0] + @"\/" + Guid.NewGuid() + ".jpg";
            WebClient mywebclient = new WebClient();
            mywebclient.DownloadFile(picUrl.Replace("\\", ""), filepath);
            return @"data\/js\/tweets\/" + filepath;
        }
        public static void Write(string file)
        {
            string fileContents = System.IO.File.ReadAllText(file);
            string Pattern = "https?:.*twimg.*[bmp|jpg|iff|gif|pcx|tga|exif|fpx|svg|psd|cdr|pcd|dxf|ufo|eps|ai|raw|jpeg|png]";
            MatchCollection Matches = Regex.Matches(fileContents, Pattern, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
            Hashtable hash = new Hashtable();

            foreach (Match mt in Matches)
            {
                string foundMatch = mt.ToString();
                if (hash.Contains(foundMatch) == false)
                    hash.Add(foundMatch, string.Empty);
            }

            foreach (DictionaryEntry element in hash)
            {
                fileContents = fileContents.Replace(element.Key.ToString(), DownLoadPics(element.Key.ToString(), file));
                Console.WriteLine("Find Image:"+element.Key.ToString());
            }
            FileStream fs = new FileStream(file, FileMode.Create);
            fs.Write(System.Text.Encoding.Default.GetBytes(fileContents), 0, fileContents.Length);
            Console.WriteLine("OverWrite File:"+file);
            fs.Flush();
            fs.Close();
        }
    }
}
Dropbox

2016年7月27日星期三

infopath连续修改16次的限制

无论是后台代码还是rules的操作,更改表单字段的值的上限是16次。超过之后就会报错:
An error occurred in the form's code. The number of calls to the Changed event for a single update in the data exceeded the maximum limit.

我找了好久,包括infopath设置中心和注册表。都无法改变这个上限。可是我需要的要三倍于这个值。
然后最终的解决的方案是做一个按钮,每次只触发16次,如果需要再点击。