Last time I said about the OAuth protocol ..

Just use the example to give an example. But I didn’t elaborate on the protocol..

Today I will introduce the difference and improvement between 1.0a and 1.0..

The premise is that you have already seen the agreement.. have a simple understanding of the agreement..

The improvements in 1.0a mainly include the following:

1. The oauth_callback parameter is placed in the request Token.. The callback parameter is no longer accepted in authorize. At the same time, when the request Token returns the parameter, the oauth_callback_confirmed parameter is also added. The value must be true.

At 1.0, we need to specify a callback address. We need to bring in the callback parameter when requesting authorize. Then use it for user authorization and return.

In 1.0a, the parameter of this oauth_callback becomes a mandatory parameter. And the address must be placed in the first request Request Token. Also as a parameter of base_string. If the callback address of the third-party application does not exist or is otherwise impossible An application with a callback address (such as a desktop application). This parameter must be [oob] (the content in square brackets is case sensitive). If the server receives it, you need to add an oauth_callback_confirmed parameter. The value must be [true] (in the brackets).

2. After the authorization is over, increase the oauth_verifier parameter.

After the authorization is successful in 1.0, jump directly into the callback to obtain the Access Token operation.

In 1.0a, after the authorization is successful, the server will return a parameter named oauth_verifier. It is used as the necessary parameter to get the Access Token in the next step.

If the third-party application does not have a callback address, the server needs to display the oauth_verifier parameter and inform the user that it needs to manually authenticate to the third-party application. The service provider needs to ensure that the value is available on some special devices (such as mobile phones). Manual input.

This parameter is not needed during future request API validation.

Ok. I know the difference is so much.. If you have any difference, you can tell me to supplement it.

In addition, the 1.0a protocol is now obsolete. Because OAuth already has a formal 1.0 protocol and has become the RFC5849 standard.

OAuth seems to have received too much attention from the industry since birth.. Several large wall sites have OAuth authentication APIs..

Chatting in the group today. Someone asked me: In addition to Douban everyone Sina Weibo. Which one provides api?

I suddenly said it. I feel a bit bleak for the domestic environment..

Far away.. Let’s analyze OAuth today.. How to use OAuth.

The reason for writing this article is that when I was learning the OAuth protocol.. I found some articles.. are from a document called [OAuth Development Documentation.docx]..

More general.. and not easy to understand..

So I think I need to describe the OAuth protocol in my own words.

For a better explanation, let’s use the watercress as an example.

A user A has registered an account on Douban. After logging in, he can perform some actions, such as publishing a broadcast.

So good. Now there is a website B.. I want A to post a broadcast on my website..

But there is a problem. Website B is unreliable for User A. User A does not want to put his account password on Website B..

In addition, Website B is also unreliable for Douban. Douban does not know whether Website B is a real user.

In order to solve this problem.. These three people (Douban / User A / Website B) sat together and opened a small meeting..

The result of the meeting is the OAuth protocol.

This agreement seems a bit complicated for security.. I will simply say the next step.. I have some metaphors that are not appropriate. Just let everyone understand the steps.

There are three steps in the big steps.

Before these steps: Website B has to go to Douban to apply for a token 1 (oauth_consumer_key) and a key 1 (oauth_consumer_secret) (a lot of keys. This key is called key 1).. It is two people to meet each other.. Then website B again Go visit Douban. Douban can know: Oh. Is this not B?

first step.

Website B took the key to talk to Douban. Hi brother. I came.. Then Douban said: I only recognize the key does not recognize people. Pick up your token 1 (oauth_consumer_key) and key 1 (oauth_consumer_secret) I will identify .

At this time, the website B is wary and come out. After the watercress is verified, it says: Oh, yes. You are B. That’s good. I will give you another key 2 (oauth_token_secret) and token 2 (oauth_token)..

Website B took it back.

The second step.

At this time, User A is about to participate.. Website B holds the token 2 (oauth_token) and the key 2 (oauth_token_secret) with A to visit the watercress. At this time, the three people stand one.. Douban first to verify that user A is not true.

In terms of action, user A needs to log in on Douban. If the verification is successful, Douban needs to ask user A.

Douban says: A, do you know that B? Do you let him move your things?

A said: I know him, he is my good brother. I am moving with something.

At this time, Douban will know. That’s good.. That website B can add and delete things from me.

In addition, Website B is still provided to Douban a back door.. A agrees. Douban requires A user to take the key 2 to the back door to find the website B.

third step.

If the above is still smooth.. Website B will take the key 1 (oauth_consumer_secret) and the key 2 (oauth_token_secret) to visit the watercress..

After the Douban is verified again, it will give the website B a key 3 (oauth_token_secret) and a token 3 (oauth_token)..

Although this name is oauth_token. But we are generally called oauth_access_token.

At this time for the user / Douban, Website B can be trusted.

If website B wants to modify the content of user A in the future, you need to take the key 1 (oauth_consumer_secret) and key 3 (oauth_token_secret) to find the watercress.

This is the end of the process..

The above steps are generally like this.. but some details are different. For example, signature encryption, etc.

This can be carefully understood from my code.

We can take the Douban API to test it.

Get the access_token. If you like to use the open source OAuth library, you can.. I understand it for myself. So I wrote one.

After getting the access_token. Every time you add, delete or change things, you need to sign the URL secret, etc.. Put it in the header.

When you request the API, for example, the URL to publish a broadcast API is

Every time you request. Douban must check this header.. See what is verified..

For example, when he looks at the header is Authorization: OAuth.. I know that it is OAuth authentication.

At this time he will check the necessary fields, such as oauth_consumer_key.

The rest of you can go to see the OAuth protocol to see my code..

I wrote a douban test. You can try it.

You have to apply for an application first. Then modify the address in config.php: is a WordPress plugin that converts links in your articles or comments into short URLs for Using the [”name”] link[/] or the [] link[/] in the article will automatically resolve to the short URL, you don’t need to enter it in the comments. These specific tags,, will automatically convert them to short URLs. Due to the need to make a request, the cURL extension must be enabled on your server! Note: This plugin will permanently change the link you entered! allows you to publish links in your posts or comments using short URL service. With [”name”]link[/] or []link[/goo .g] you will not have to write such special codes. will change the links automatically. The cURL functions must be available on your server. WARNING: This plug-in will permanently change your Input link!

wp shortener


1. Pass the directory to your wp-content\plugins.
2. Open in the background.
3. Adding the [”name”] link[/] or the [] link[/] will automatically resolve to the short URL of when posting the article.
4. You can set the article or comment in the settings!

== Installation ==

1. Upload `googl-url-shortener-for-wordpress` to the `/wp-content/plugins/` directory
2. Activate the plugin through the ‘Plugins’ menu in WordPress
3. Use [”name” ]link[/] or []link[/] in your posts.

Please test if you have any questions, please contact us with subject HTML classes for beginners and our team at Skiyo will help you.


Is modified according to URL Shortener plugin into PHP version:

Don’t ask me what’s the use…= =||


Include ( 'GoogleShorter.class.php' ) ; 
$g  =  new GoogleShorter ( ) ; 
echo  $g -> getURL ( '' ) ;

The next step is to develop a wp plugin so that the URL you post when posting articles and comments can automatically become a short URL 🙂

March 22, 2010

As a mid-level PHPer rookie.. bored, love to twirling in various PHP forums. I saw a lot of PHP beginners have asked a lot of the same questions. And I also encountered PHP when I learned. In order to let PHP begin Scholars take less detours. So suddenly nervous. Decided to write this article. For PHP beginners only. If there is an error. Also hope to point out. Not very grateful.

PHP is actually a very easy to learn language. If you want to be proficient in PHP for three years. Less than a year is enough. But why are we still a rookie after three years?

I don’t know where to start. Learning PHP we have to learn the database. Learning architecture. Learning object-oriented. Learning front-end. Learning linux. Learning protocols and even artists directly lead to PHPer is now the most tired programmer.

The most tired is nothing. Often PHP is considered to be the inferior program. With the lowest salary, it is necessary to master almost all knowledge of the web. This is really unfair.

The good news is that we have gradually seen a change in China. More and more companies in China have turned to PHP from Java or C#. So PHPer must have their own dreams. You will all be very B. Please firmly believe.

Going far. Going back to the point I want to talk about. The following questions contain the problems I have encountered. Maybe I don’t necessarily say that or you don’t necessarily agree with me. I am very willing to accept your opinion. In short, we Just want to make PHPer stand up 🙂

1. The problem of coding

This is not only PHP.. as long as it is on the program. It will be encountered. At least I and I have encountered people around. And in the web. Often coding problems are very difficult to solve. Very difficult to debug. Sometimes the program is out Inexplicable problems, it is hard to think of coding problems and so on.

These problems are always bothering us. So I recommend PHP beginners. Must be coded uniformly. It is strongly recommended to be unified to UTF-8. Chinese is not recommended to use GBK or GB2312, etc. Because it is not known when transmitting in AJAX. Coded.

If you want to unify the code, you should pay attention to wherever the code may appear.

1) Encoding of the header header

Personally suggest that you should add the following sentence in your PHP (except for special headers)

Header ( "Content-type: text/html;charset=utf-8" ) ;

This can avoid some problems. For example, we can see that some sites submit an alert and then jump. But they do not set the encoding. If his encoding is inconsistent with the browser’s default encoding, it will be garbled.
You are pure HTML. Be sure to put the meta code tag in front of the title tag. If you don’t understand it, remember to put the coded information in the first line of the head tag. The final result is this.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

2) Encoding of the file

We save the file, select the encoding must be unified. If you follow the above, we should choose UTF-8.
General editors have encoded the information in this document. If you are found not to be UTF-8. Please change immediately.
For example, We opened a template file in Dreamweaver. We found GB2312 (Simplified Chinese) in the lower right corner. Do not make any changes at this time. Immediately CTRL+J and then select the encoding to change to UTF-8 mode and save.

The encoding of the file is not necessarily a PHP file. You must also ensure that your JavaScript and css files are UTF-8 encoded.

Another important point is that BOM.. This Dongdong PHP is not very popular. So we have to choose UTF-8 without BOM format when saving. If you use the editor is UE. Then please focus Pay attention to this.

3) Database coding

I don’t want to say more about this. There are too many articles on the Internet. If you are MySQL, remember to do SET NAMES = ‘utf8’ every time you connect. And there is no horizontal line in the middle of utf8.

2. The problem of MVC

The programmer should theoretically be a perfectionist. They don’t just think about running the program. It’s also elegant.

But then again. After the program is finished according to MVC, is our code elegant? The answer is of course no.

Learning architecture is a process of understanding. When you really appreciate the benefits of this architecture, you will understand its true meaning. Don’t blindly.

Sometimes we will do this. Use this month to learn MVC. Ok. I think you should do this. You learn to set your own goals.

But after a month we may not really understand MVC.. But at least we will base his basics according to his model. In other words, maybe we have not learned about the Sunflower Collection. But we should use the evil spirits.

3. Object-oriented issues

About PHP object-oriented problems. It has always been entangled. Some people do not think that PHP object-oriented is a good thing. Some people don’t even think that object-oriented is a good thing, such as Linus.

We don’t have to entangle this thing in the end. At least we should know from the birth of object-oriented to the present. After so many years of evolution. Apply to various projects and even language. We have reason to believe that existence has its truth.

Practice is the only criterion for testing truth. The more the object-oriented development, the better the situation. It seems that our study becomes a must.

Similar to the knowledge of some architectures. Object-oriented is not so eager to learn. Object-oriented is a kind of idea. But when it comes to a certain language, its meaning will also undergo some subtle changes.

PHP’s object-oriented is very flexible. Coupled with its unique magic method. It will create a special situation of object-oriented. Perhaps this is not the same as your usual object-oriented Java.

Not necessarily putting the methods you need into a class is object-oriented. When you really realize that object-oriented coding for you brings convenience and convenience, you have a deeper understanding of object-oriented.

The so-called desire is not up. Don’t worry. You want to understand the theory of relativity within a few days. It is purely nonsense.

4. Algorithm problem

It seems that PHP is always far from the algorithm. Most of PHP’s algorithms are based on arrays. And we know that the properties of PHP’s arrays are destined to be very large when the array becomes very large.

In fact, PHP is a website. You don’t have to give her a high hat. In the web, especially in the actual situation of the front end of the PHP service, there will be very few algorithms involved.

PHP’s algorithmic interview questions are nothing more than operations on arrays or on strings. Moving the brain with the manual. That’s basically fine.

Then you may ask. I want to learn PHP. Then I still learn algorithms?

I think you need to learn. And you need to learn the data structure. This homework is like an internal work. It will affect your coding in a subtle way.

At this time, we will cooperate with the swordsmanship in front of us. Congratulations, you have learned the Sunflower Collection!

5. The problem of the framework

The framework of PHP is the most common in all languages. It doesn’t use frameworks. What framework is chosen is a controversial topic..

My suggestion is to recommend learning at least one framework. This can deepen your understanding of PHP. Our learning framework is not to learn how to use this framework. How to do projects.

We’re going to look at its source code. See how he implemented it. At this point you can choose to develop a small framework yourself. It’s not good to ask for it. Don’t ask others how many projects to use.

We are just learning.

6.JavaScript issues

I can say that I have seen so many languages. The most amazing thing is JavaScript. Usually Java has always claimed that everything is an object. In fact, I think JavaScript is everything.

Is JavaScript eager to learn? It’s hard to learn! In fact, it is usually used in the web. The general JavaScript operation is the DOM operation.

Is JavaScript difficult to learn? Difficult to learn! If we are bound by object-oriented thinking in other languages, it is difficult to understand the object-oriented JavaScript. And there are many concepts in JavaScript.

Prototype arguments call apply callee caller Concepts such as closures make us overwhelmed. Coupled with the strange JavaScript code style and its difficult to debug features directly lead us to avoid these rookies.

I once forwarded a code that implements document.ready. I have to admire the difference.

Personally feel that looking at some JavaScript framework source code is the best way to learn. I used to write my PHP framework. Because of the use of the unified entry + their own defined URL rules. So when you use the normal property for the get form Can not get the parameters.

At this time I thought of the formSerialize method in jQuery.form. I picked it up and made some changes. I can use it.

7.CSS issues

I think it’s different from separating CSS from JavaScript. I think CSS learning is more characteristic.

In fact, I want to say that CSS is the simplest thing. We just know some basic CSS properties. Writing a page is definitely not a problem.

The main feature of CSS is that it must be done. You can’t write a page instead of the actual CSS book.

Another feature of CSS is that it is much more. Maybe this property can’t achieve your effect. Then you change one. This is the most stupid and most effective way 🙂

Of course, this is only the requirement of the primary CSS. After this, we have to be compatible with the browser. In fact, this is not difficult to say that several browsers open a property and a property at the same time.

You can also memorize some hacks, such as IE6 _ IE knows *, etc. If you think that writing CSS is not enough standard, then put the hack in a different css file. For example, ie6 is called ie6.css

Then use the following code on the page.

<!--[if lt IE 6]>
	<link href="css/ie6.css" rel="stylesheet" type="text/css" />

The more advanced is of course the user experience and design. I don’t know if I don’t understand it. @_@ Hope to add people.

8.linux problem

Personally, I strongly recommend that you install a Linux system on everyone’s computer. If you feel too tossing, you can choose to install Ubuntu in wubi mode. This is the easiest and most effective way for lazy people.

When you are bored, you can download a PHP source code and try it yourself. Avoid apt-get. Because often the server version is not rhel or centos. There is no such command.

And apt-get is often not the latest version, and can not be customized.

Linux always has such inexplicable problems as living. For example, if the environment is slightly different, the compiler will not pass. The service will not come.

Don’t worry at this time. Look at the error message to see the log. Google try to solve it yourself.

After compiling, don’t feel like trying out different configurations. Also modify the source code and try again.

For example, we downloaded a source code for nginx. Then modify some headers and other places. You can compile your own HTTP Web Server.

Of course, if you call BWS or GWS, you can do 🙂

There is still a problem Linux needs to back command? This is understandable. Remember some common commands can improve the speed. I need to reflect on this point. Often some commonly used commands also need to look at the parameters..

The other one is Shell’s problem. Shell is not difficult. But the grammar is ugly in my opinion @_@. Look at the wiki to learn more than half.. The main thing is to contact. We can see a phenomenon. Some companies are This is also a must for recruiting advanced PHPer.

In fact, online linux information is very much. Most of the problems you encounter will be encountered by others. So good at using Google. And familiar with English.

9. Language issues

The problem of this is too much war of words. In the end, no one has won. We don’t have to participate in these boring things. These are the young manures to do.

You have a cow B, do you have Linus cattle B? He sprayed C++ for so many years. How about C++?

So we don’t have to entangle ourselves. It’s OK to do what you do.

Since you have chosen PHP, don’t hesitate.

Maybe PHP is not enough when we are working on a project. Then we can use Java or C to make a middleware. This is not a good idea.

One language to play her biggest and most useful is the truth.

10. Attitude issues

Attitude must be modest and cautious. This is a virtue that a programmer should have. Don’t self-inflate.

The more you learn, the more you will find yourself.

Waiting for your cow B, you can say some arrogant words. But now we are not cattle B. At least if you see this article I wrote. You should not be a cow B. I said this article is for beginners. of:-)

11. Women’s problems

Hey.. solve this problem yourself @_@

Click to enlarge. These images are just previews. I will automatically compress and add watermarks when I upload them.

The usage method is basically the same as the tab plugin for jQuery UI. It was because I felt that the UI tab was too bloated to write this simple plugin. The packaged version of this plugin is only 1.5K.
If you want to receive using ajax, you need to specify the rel attribute of the a tag in li.
Right click to open the source code of this page, the basic example is included in this code.

There are also some parameters that can be seen in the source code.
This version prevents fast switching and adds mouse event options.


The latest update on March 19: Fixed a bug that IE6 can’t use, and now supports most browsers.

The latest update on October 20: When using AJAX, the second activation of the tab is no longer AJAX read. Save resources. Add multiple parameters such as the default tab option, which can be viewed in the source code.

Latest update on January 18: Join the automatic switching feature.

I received a job today. I recognized a simple verification code. This verification code is very simple. It has very little interference information. So just get the information for comparison. It is easy to identify.

But everything won’t be so smooth. Maybe it’s for me. I think what I do is very tortuous…

This captcha image is generated using ASP.. It is of course a BMP format.

But for PHP, this is a soft injury. Because PHP’s GD library does not include BMP at all. Although there is wbmp, it is still different.

So I googled it. The result made me feel a bit of joy. There is a ready-made class that recognizes 256-color BMP. It is very exciting. It is not a matter of white money!!

The result is disappointing. The 256-color BMP and 24-bit color are basically two concepts. This means that I have to rewrite it..

It seems that there are no ready-made libraries and functions. You can only write it yourself. Analyze the BMP header with the most primitive fopen. A byte read.

All went to google BMP 24-bit color head analysis.. so long article… immediately disappointed..

So boring to go through the manual.. Look at the imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromwbmp and so on. There is no imagecreatefrombmp

So suddenly whimsy. Go to google about imagecreatefrombmp what will be the result.. Sure enough, I did not expect. There have been people who wrote this function..

  1. function imagecreatefrombmp($file)
  2. {
  3.     global  $CurrentBit$echoMode;
  4.     $f=fopen($file,“r”);
  5.     $Header=fread($f,2);
  6.     if($Header==“BM”)
  7.     {
  8.         $Size=freaddword($f);
  9.         $Reserved1=freadword($f);
  10.         $Reserved2=freadword($f);
  11.         $FirstByteOfImage=freaddword($f);
  12.         $SizeBITMAPINFOHEADER=freaddword($f);
  13.         $Width=freaddword($f);
  14.         $Height=freaddword($f);
  15.         $biPlanes=freadword($f);
  16.         $biBitCount=freadword($f);
  17.         $RLECompression=freaddword($f);
  18.         $WidthxHeight=freaddword($f);
  19.         $biXPelsPerMeter=freaddword($f);
  20.         $biYPelsPerMeter=freaddword($f);
  21.         $NumberOfPalettesUsed=freaddword($f);
  22.         $NumberOfImportantColors=freaddword($f);
  23.         if($biBitCount<24)
  24.         {
  25.             $img=imagecreate($Width,$Height);
  26.             $Colors=pow(2,$biBitCount);
  27.             for($p=0;$p<$Colors;$p++)
  28.             {
  29.                 $B=freadbyte($f);
  30.                 $G=freadbyte($f);
  31.                 $R=freadbyte($f);
  32.                 $Reserved=freadbyte($f);
  33.                 $Palette[]=imagecolorallocate($img,$R,$G,$B);
  34.             };
  35.             if($RLECompression==0)
  36.             {
  37.                 $Zbytek=(4-ceil(($Width/(8/$biBitCount)))%4)%4;
  38.                 for($y=$Height-1;$y>=0;$y–)
  39.                 {
  40.                     $CurrentBit=0;
  41.                     for($x=0;$x<$Width;$x++)
  42.                     {
  43.                         $C=freadbits($f,$biBitCount);
  44.                         imagesetpixel($img,$x,$y,$Palette[$C]);
  45.                     };
  46.                     if($CurrentBit!=0) {freadbyte($f);};
  47.                     for($g=0;$g<$Zbytek;$g++)
  48.                     freadbyte($f);
  49.                 };
  50.             };
  51.         };
  52.         if($RLECompression==1) //$BI_RLE8
  53.         {
  54.             $y=$Height;
  55.             $pocetb=0;
  56.             while(true)
  57.             {
  58.                 $ and -;
  59.                 $prefix=freadbyte($f);
  60.                 $suffix=freadbyte($f);
  61.                 $pocetb+=2;
  62.                 $echoit=false;
  63.                 if($echoit)echo “Prefix: $prefix Suffix: $suffix<BR>”;
  64.                 if(($prefix==0)and($suffix==1)) break;
  65.                 if(feof($f)) break;
  66.                 while(!(($prefix==0)and($suffix==0)))
  67.                 {
  68.                     if($prefix==0)
  69.                     {
  70.                         $pocet=$suffix;
  71.                         $Data.=fread($f,$pocet);
  72.                         $ pocetb + = $ number ;
  73.                         if($pocetb%2==1) {freadbyte($f); $pocetb++;};
  74.                     };
  75.                     if($prefix>0)
  76.                     {
  77.                         $ count = $ prefix ;
  78.                         for($r=0;$r<$pocet;$r++)
  79.                         $Data.=chr($suffix);
  80.                     };
  81.                     $prefix=freadbyte($f);
  82.                     $suffix=freadbyte($f);
  83.                     $pocetb+=2;
  84.                     if($echoitecho “Prefix: $prefix Suffix: $suffix<BR>”;
  85.                 };
  86.                 for($x=0;$x<strlen($Data);$x++)
  87.                 {
  88.                     imagesetpixel($img,$x,$y,$Palette[ord($Data[$x])]);
  89.                 };
  90.                 $Data=“”;
  91.             };
  92.         };
  93.         if($RLECompression==2) //$BI_RLE4
  94.         {
  95.             $y=$Height;
  96.             $pocetb=0;
  97.             /*while(!feof($f))
  98.             echo freadbyte($f).”_”.freadbyte($f).”<BR>”;*/
  99.             while(true)
  100.             {
  101.                 //break;
  102.                 $ and -;
  103.                 $prefix=freadbyte($f);
  104.                 $suffix=freadbyte($f);
  105.                 $pocetb+=2;
  106.                 $echoit=false;
  107.                 if($echoit)echo “Prefix: $prefix Suffix: $suffix<BR>”;
  108.                 if(($prefix==0)and($suffix==1)) break;
  109.                 if(feof($f)) break;
  110.                 while(!(($prefix==0)and($suffix==0)))
  111.                 {
  112.                     if($prefix==0)
  113.                     {
  114.                         $pocet=$suffix;
  115.                         $CurrentBit=0;
  116.                         for($h=0;$h<$pocet;$h++)
  117.                         $Data.=chr(freadbits($f,4));
  118.                         if($CurrentBit!=0) freadbits($f,4);
  119.                         $ pocetb + = ceil (( $ number / 2));
  120.                         if($pocetb%2==1) {freadbyte($f); $pocetb++;};
  121.                     };
  122.                     if($prefix>0)
  123.                     {
  124.                         $ count = $ prefix ;
  125.                         $i=0;
  126.                         for($r=0;$r<$pocet;$r++)
  127.                         {
  128.                             if($i%2==0)
  129.                             {
  130.                                 $Data.=chr($suffix%16);
  131.                             }
  132.                             else
  133.                             {
  134.                                 $Data.=chr(floor($suffix/16));
  135.                             };
  136.                             $i++;
  137.                         };
  138.                     };
  139.                     $prefix=freadbyte($f);
  140.                     $suffix=freadbyte($f);
  141.                     $pocetb+=2;
  142.                     if($echoitecho “Prefix: $prefix Suffix: $suffix<BR>”;
  143.                 };
  144.                 for($x=0;$x<strlen($Data);$x++)
  145.                 {
  146.                     imagesetpixel($img,$x,$y,$Palette[ord($Data[$x])]);
  147.                 };
  148.                 $Data=“”;
  149.             };
  150.         };
  151.         if($biBitCount==24)
  152.         {
  153.             $img=imagecreatetruecolor($Width,$Height);
  154.             $Zbytek=$Width%4;
  155.             for($y=$Height-1;$y>=0;$y–)
  156.             {
  157.                 for($x=0;$x<$Width;$x++)
  158.                 {
  159.                     $B=freadbyte($f);
  160.                     $G=freadbyte($f);
  161.                     $R=freadbyte($f);
  162.                     $color=imagecolorexact($img,$R,$G,$B);
  163.                     if($color==-1) $color=imagecolorallocate($img,$R,$G,$B);
  164.                     imagesetpixel($img,$x,$y,$color);
  165.                 }
  166.                 for($z=0;$z<$Zbytek;$z++)
  167.                 freadbyte($f);
  168.             };
  169.         };
  170.         return $img;
  171.     };
  172.     fclose($f);
  173. };
  174. function freadbyte($f)
  175. {
  176.     return ord(fread($f,1));
  177. };
  178. function freadword($f)
  179. {
  180.     $b1=freadbyte($f);
  181.     $b2=freadbyte($f);
  182.     return $b2*256+$b1;
  183. };
  184. function freaddword($f)
  185. {
  186.     $b1=freadword($f);
  187.     $b2=freadword($f);
  188.     return $b2*65536+$b1;
  189. };

The process of this function is like this: Open the file with fopen. Read one byte and one byte. Read the BMP header first. Then read the pixel line by line. Then use imagecreatetruecolor to create an image. Just read the pixel. Then draw one by one to the image you just created.
Finally return the resource of this image.

It is estimated that everyone is like me. I was scared by such a long function at the beginning. In fact, don’t be afraid. Analyze it. We want to analyze the 24-bit color BMP. So most of the above functions do not use .if($biBitCount= =24) The following are the key:


These three lines are for reading pixels. All we need is to put each pixel into an array. This is easy to manipulate.

$array[] = sprintf(“%03d”,$R).sprintf(“%03d”,$G).sprintf(“%03d”,$B);

So we put each pixel in the array of $array. But this is not enough. Because we have to identify the pixel. So I think so. Change the white (255255255) to 0. The other colors are changed to 1. This is because my verification code is relatively simple. And the interference color is very small..

The resulting $array is similar to this.

0001111000   0001111000   0001111000   0000101000
0010000100   0010000100   0010000100   0000100000
0010000100   0010000100   0010000100   0000100000
0010110100   0000000100   0000000100   0000100000
0010110100   0000101000   0000000100   0000100000
0010110100   0000110000   0011000100   0000010000
0010110100   0000001000   0010111000   0000010000
0010000100   0010000100   0010000000   0010001000
0011000100   0010000110   0010000000   0010001000
0001111000   0001111000   0011111100   0011111100

Of course, the reason why this is formed is what I processed when I output it.
It is easy to see clearly. This is 0357..

Some people will ask why it is down? This is because the BMP is stored upside down when storing images. Compare BT.
But don’t worry about this. We don’t have to give him a hard time coming over. Because we are doing comparisons. This comparison code is also upside down.

In order to more clearly explain how this array is stored in white. I will give you a detailed description. Just follow the example above.

Array subscript 0 1 2 3 4 5 6 7 8 9 10….. 39
Storage contents 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 First line

Array subscript 40 41 …. …79Store
contents 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 second line

I will not write it for the sake of omission. It is easy to see. This is a one-dimensional array. There are 399 elements in total.. But in order to identify the verification code, we have to take each of them out.

0-9 40-49 80-89 … is a group of
10-19 50-59 90-99 … for a group of
20-29 60-69 100-109… for a group of
30-39 70-79 110-119.. As a group

You can write your own algorithm:

After sorting this out, it is an array of 4 elements.
Each element has 100 digits of 0 and 1.

The element is taken out. Who is it to compare with?? Yes. We have to find a reference object..
Finding the reference object is physical strength..
Return to the above process.. Constantly refresh the verification code.. until 0 -9 has appeared. For each. Write down his appearance, say 0 is like this


It becomes a string. 0 is like this. 0001111000001000010000100001000010110100001011010000101101000010110100001000010000110001000001111000
is also placed in the above order in a row.

After 0-9 is written down, we can put it in an array, called $key.

This is a one-to-one correspondence with the elements we generated.

The next step is to start comparing.

Looping is inevitable. The trick is to compare the similar_text and reference objects one by one. Put the Acacia percentage into an array.
Then take the largest percentage of the array. The corresponding index value (this index value is not automatically generated) Is the number we have identified.
The following code value describes the important part

Foreach ($keys as $key => $value) { //$key is the comparison reference group
similar_text($value, $validValue, $p);
$maxArr[$key] = $p; // put all the odds Go to the array
and then take out the largest index value of $maxArr. This is the number we identified.

At this point, the verification code is considered complete.

But when deployed to the user, I found that his machine used fopen to open the remote URL. Only 30% chance is obtained. Other cases are HTTP Request failed…
Many methods have been changed or not. The result is my solution. .
using CURL to save local codes. then fopen to open the local images 100% OK it ..

As for the detailed code, I will not post it. Because the code is sold to others. In order to protect the interests of others, so don’t open your mouth with me. I have already given the idea. I believe you can write it.

March 29, 2008
  • Very little core code, very fast, easy to learn
  • Punny is an object-oriented MVC PHP framework
  • Uses the original PHP template engine and is easy to integrate with other template engines
  • Use RESTful style URLs
  • Powerful scalability and compatibility

Experience Punny now

   Why do you need (select) Punny:

  • You are tired of learning about various frameworks
  • You hate the various constraints of the framework to the programmer.
  • You really want to learn MVC.
  • You really want to learn PHP’s object-oriented programming style.
  • Your concern and support for Punny